基于以下XML,我想检索某个节点(ID)的产品名称和图像
<?xml version="1.0" encoding="utf-8"?>
<clients>
<client id="A">
<product>Name of product A</product>
<image>Product image name A</image>
</client>
<client id="B">
<product>Name of product B</product>
<image>Product image name B</image>
</client>
</clients>
这是PHP代码:
$doc = DOMDocument::load('clients.xml');
$xpath = new DOMXPath($doc);
$query = '//client[@id="A"]';
$info = $xpath->query($query);
如果我执行$info->item(0)->nodeValue,我会同时获取这两个信息,而不是单独获取:
Name of product A
Product image name A
但是我想根据客户端 ID 获取 ->product->nodeValue 和 image->nodeValue。我该怎么做?例如,执行$info->item(0)->product->nodeValue不起作用。
->item(0)->nodeValue 给出了该特定项目中的所有内容(在本例中为 0)
使用 XPath 获取节点。XPath 位置路径的结果是节点列表。->item(0) 返回此列表中的第一个节点。这是client
元素节点。
调用 DOMElement:$nodeValue 始终将所有后代文本节点作为字符串返回。在本例中,product
中的文本节点和 image
元素节点。
如果需要单独的值,您将拥有获取子节点的。
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXpath($dom);
foreach ($xpath->evaluate('//client[@id="A"]/*[self::product or self::image]') as $child) {
echo $child->localName, ': ', $child->nodeValue, "'n";
}
输出:
product: Name of product A
image: Product image name A
结果返回单个节点(客户端)。该节点的节点值是其下的所有文本。
尝试:"//client [@id='A']/*[name()='product' or name()='image']" 将返回两个节点。如果您想按位置使用它们,请记住检查名称。