digitalmads
digitalmads

Reputation: 7

Getting a specific XML element value with PHP

I have an XML structure like this

<companies>
   <company>
      <vatno>12345678</vatno>
      <name>
         <founded>2013-12-31</founded>
         <text>XYZ Inc</text>
      </name>
      <location>
         <streetname>West Road</streetname>
         <county>
            <no>12345</no>
            <text>East County</text>
         <county>
      </location>
   </company>
</companies>

I am trying to get specific info from the elements into PHP variables.

To get "vatno" I use:

$vatno = $xmlObject->item($i)->getElementsByTagName('vatno')->item(0)->childNodes->item(0)->nodeValue;

But what if I need the county name for example?

I cannot use getElementsByTagName('text') as it would get the company name also using the element name "text".

Upvotes: 0

Views: 49

Answers (2)

digitalmads
digitalmads

Reputation: 7

It works with SimpleXML if I use

$xml = simplexml_load_string($data);
foreach ( $xml->companies->company as $company )   {
    echo $company->vatno.PHP_EOL;
    echo $company->location->county->text.PHP_EOL;
}

Upvotes: 0

Nigel Ren
Nigel Ren

Reputation: 57131

You may be better off using SimpleXML, you can then access the various components in a more intuitive way. The example above would be something like...

$data = <<< XML
<companies>
   <company>
      <vatno>12345678</vatno>
      <name>
         <founded>2013-12-31</founded>
         <text>XYZ Inc</text>
      </name>
      <location>
         <streetname>West Road</streetname>
         <county>
            <no>12345</no>
            <text>East County</text>
         </county>
      </location>
   </company>
</companies>
XML;

$xml = simplexml_load_string($data);
foreach ( $xml->company as $company )   {
    echo $company->vatno.PHP_EOL;
    echo $company->location->county->text.PHP_EOL;
}

So each sub element is accessed using ->.

If you wanted to stick with what you already had, you should be able to use...

$countyName = $xmlObject->item($i)->getElementsByTagName('text')->item(1)
->nodeValue;

Using item(1) will fetch the second instance of the <text> elements, so this assumes that the name will have this value as well.

Upvotes: 1

Related Questions