以下是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');
}
有什么建议吗?谢谢!
答案 0 :(得分:1)
表达式:
shipping[@cost]
将返回<shipping>
元素(节点),而不是任何属性字符串。 [...]
是一个谓词,用于选择某个节点。它说:&#34;选择包含shipping
属性的cost
元素&#34;。所以你实际上是在两个表达式中选择相同的节点。
由于您shipping
上下文中只有一个$node
元素,因此不需要任何谓词。
要实际选择属性,您需要添加额外的步骤:
shipping/@cost
shipping/@carrier