XML PHP 获取子值

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'];
           }
    }

我正在尝试获取过滤器值,但我的代码没有显示任何内容。我看到了一些关于 xpath 的东西,但不知道它是否适用于这种情况。你有什么线索吗?

--

当 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>
        <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>

然后我可以这样做:

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

您在内部循环中引用为 $child 的元素实际上指向 <filter> 节点,而不是您尝试为其定位属性的子 <value> 节点。所以这实际上只是扩展外部 foreach 循环以迭代 $xml->category->filters->filter 而不是其父 $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";
    }
}

这里是演示:https://3v4l.org/Rqc4Y

使用 xpath,您可以直接定位内部节点。

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

https://3v4l.org/vPhKE

这两个例子的输出

Test1
Test2
Test3
Test4
Test5
Test6