按子节点值过滤XML元素

问题描述 投票:1回答:1

我有一个带有产品的feed,所有产品都有一个名为'category'的子节点,带有一个值。我无法找到返回具有特定类别值的所有产品的方法。

XML看起来像这样

<product>
    <name>xxxx</name>
    <category>Category A</category>
</product>
<product>
    <name>xxxx</name>
    <category>Category B</category>
</product>
<product>
    <name>xxxx</name>
    <category>Category A</category>
</product>
<product>
    <name>xxxx</name>
    <category>Category B</category>
</product>
<product>
    <name>xxxx</name>
    <category>Category B</category>
</product> 

我已经尝试使用这样的PHP代码循环遍历XML:

$xml = simplexml_load_file('file.xml');

foreach ($xml as $product) {

    if ((string) $product['category'] == 'Category A') {
        echo (string) $product['name'];
    }

}

预期结果是返回/回显该产品的其他子节点。对此最好的方法是什么?

php xml simplexml
1个回答
0
投票

你的方法似乎很合理,我对SimpleXML不太熟悉,说明为什么它不起作用。但是,既然你要求最好的方法,我自己偏爱DomDocument和XPath:

$xml = <<< XML
<?xml version="1.0"?>
<products>
    <product>
        <name>xxxx</name>
        <category>Category A</category>
    </product>
    <product>
        <name>xxxx</name>
        <category>Category B</category>
    </product>
    <product>
        <name>xxxx</name>
        <category>Category A</category>
    </product>
    <product>
        <name>xxxx</name>
        <category>Category B</category>
    </product>
    <product>
        <name>xxxx</name>
        <category>Category B</category>
    </product>
</products>
XML;

$dom = new DomDocument;
$dom->loadXML($xml);
$xpath = new DomXPath($dom);
$search = "Category A";
$nodes = $xpath->query("//product[category='$search']/name");

foreach ($nodes as $node) {
    printf("%s\n", $node->textContent);
}

对于SimpleXML,经过一点挖掘后,它看起来需要访问带有对象表示法的元素,而不是数组表示法。这对我有用:

$x = simplexml_load_string($xml);
foreach ($x->product as $product) {
    if ((string) $product->category == 'Category A') {
        echo (string) $product->name;
    }
}

但我坚持认为,从长远来看,学习DOM和XPath方法将为您提供更好的服务;它们都是用于多种语言的完善标准。有关SimpleXML的知识不是您可以转移到其他环境的。

© www.soinside.com 2019 - 2024. All rights reserved.