我有一个带有产品的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'];
}
}
预期结果是返回/回显该产品的其他子节点。对此最好的方法是什么?
你的方法似乎很合理,我对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的知识不是您可以转移到其他环境的。