【问题标题】:Using XPATH to access values of XML element with multiple attributes使用 XPATH 访问具有多个属性的 XML 元素的值
【发布时间】:2014-05-03 14:11:19
【问题描述】:

这是 XML 结构的 sn-p:

<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 元素中只有一个属性时(例如 &lt;product category="Desktop"&gt;),这可以正常工作:

$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');
}

有什么建议吗?谢谢!

【问题讨论】:

    标签: php xml xpath xmlreader


    【解决方案1】:

    表达式:

    shipping[@cost]
    

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

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

    要真正选择一个属性,你需要添加一个额外的步骤:

    shipping/@cost
    shipping/@carrier
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2018-10-13
      • 2012-11-30
      相关资源
      最近更新 更多