ziad.ali
ziad.ali

Reputation: 341

XML PHP Get children value

XML:

    <Result xmlns="" xmlns:xsi="" totalResultsAvailable="0" totalResultsReturned="0" schk="true" totalLooseOffers="0" xsi:schemaLocation="">
        <details>
            <ID></ID>
            <applicationVersion>1.0</applicationVersion>
            <applicationPath/>
            <date>2016-05-23T12:17:16.369-03:00</date>
            <elapsedTime>17</elapsedTime>
            <status>success</status>
            <message>success</message>
        </details>
        <category id="1">
        <thumbnail url="http://image.google.com/test.jpg"/>
        <links>
            <link url="www.google.com" type="category"/>
            <link url="www.google2.com" type="xml"/>
        </links>
        <name>Category</name>
        <filters>
            <filter id="1" name="Filter1">
               <value id="1" value="Test1"/>
               <value id="2" value="Test2"/>
               <value id="3" value="Test3"/>
            </filter>
           <filter id="2" name="Filter2">
               <value id="1" value="Test4"/>
               <value id="2" value="Test5"/>
               <value id="3" value="Test6"/>
            </filter>
        </filters>
        </category>
</Result>

PHP:

  $xml = simplexml_load_file("http://xml.com");
    foreach($xml->category->filters as $filters){
           foreach($filters->children() as $child){
                   echo $child['value'];
           }
    }

I'm trying to get the filters value, but nothing shows with the code i have. I saw something about xpath but don't know if it's applicable in this situation. Do you have any clue?

--

When the XML looks like this:

<Result xmlns="" xmlns:xsi="" totalResultsAvailable="0" totalResultsReturned="0" schk="true" totalLooseOffers="0" xsi:schemaLocation="">
        <details>
            <ID></ID>
            <applicationVersion>1.0</applicationVersion>
            <applicationPath/>
            <date>2016-05-23T12:17:16.369-03:00</date>
            <elapsedTime>17</elapsedTime>
            <status>success</status>
            <message>success</message>
        </details>
        <subCategory id="1">
           <thumbnail url="http://image.google.com/test.jpg"/>
           <name>Subcategory</name>
        </subCategory>
        <subCategory id="2">
           <thumbnail url="http://image.google.com/test2.jpg"/>
           <name>Subcategory2</name>
        </subCategory>
</Result>

Then am able to do this:

foreach($xml->subCategory as $subCategory){
        $categoryId   = $subCategory['id'];
        $categoryName = $subCategory->name;
} 

Upvotes: 1

Views: 2504

Answers (1)

Michael Berkowski
Michael Berkowski

Reputation: 270609

The elements you reference as $child in the inner loop actually point to the <filter> nodes, not the children <value> nodes you are attempting to target attributes for. So this really is just a matter of extending the outer foreach loop to iterate over $xml->category->filters->filter rather than its parent $xml->category->filters.

// Iterate the correct <filter> node, not its parent <filters>
foreach ($xml->category->filters->filter as $filter) {
    foreach($filter->children() as $child){
        echo $child['value'] . "\n";
    }
}

Here it is in demonstration: https://3v4l.org/Rqc4Y

Using xpath, you can target the inner nodes directly.

$values = $xml->xpath('//category/filters/filter/value');
foreach ($values as $value) {
    echo $value['value'];
}

https://3v4l.org/vPhKE

Both of these examples output

Test1
Test2
Test3
Test4
Test5
Test6

Upvotes: 2

Related Questions