使用XPATH访问具有多个属性的XML元素的值

时间:2014-05-03 14:11:19

标签: php xml xpath xmlreader

以下是XML结构的片段:

<product category="Desktop">
<name> Desktop 1 (d)</name>
<shipping cost="10.00" carrier="UPS" />
</product>

<product category="Tablet">
<name>Tablet 1(t)</name>
<shipping cost="0" carrier="Fed Ex" />
</product>

将XMLReader与XPATH一起使用,我试图获取某些XML元素属性的值

$reader = new XMLReader;
$reader->open('products.xml');
$dom = new DOMDocument;
$xpath = new DOMXpath($dom);

while ($reader->read() && $reader->name !== 'product') {
continue;
}
while ($reader->name === 'product') {
$node = $dom->importNode($reader->expand(), TRUE);

当XML元素中只有一个属性(例如<product category="Desktop">)时,这样可以正常工作:

$category = $xpath->evaluate('string(@category)', $node);

但是当XML元素(IE)中有多个属性时,这不起作用:

$shippingCarrier = $xpath->evaluate('string(/shipping[@cost])', $node);
$shippingCost = $xpath->evaluate('string(/shipping[@carrier])', $node);

echo "Category: " . $category . ". ";
echo "Shipping Carrier: " . $shippingCarrier . ". ";
echo "Shipping Cast: " . $shippingCost . ". ";
}
$reader->next('product');
}

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

表达式:

shipping[@cost]

将返回<shipping>元素(节点),而不是任何属性字符串。 [...]是一个谓词,用于选择某个节点。它说:&#34;选择包含shipping属性的cost元素&#34;。所以你实际上是在两个表达式中选择相同的节点。

由于您shipping上下文中只有一个$node元素,因此不需要任何谓词。

要实际选择属性,您需要添加额外的步骤:

shipping/@cost
shipping/@carrier