我正在xml流上运行xpath查询并检索一组数据。在这我需要找到标签的名称。但是我找不到检索标签名称的方法。xml流是
<Condition>
<Normal dataItemId="Xovertemp-06" timestamp="2011-09-02T03:35:34.535703Z" name="Xovertemp" sequence="24544" type="TEMPERATURE"/>
<Normal dataItemId="Xservo-06" timestamp="2011-09-02T03:35:34.535765Z" name="Xservo" sequence="24545" type="LOAD"/>
<Normal dataItemId="Xtravel-06" timestamp="2011-09-02T03:35:34.535639Z" name="Xtravel" sequence="24543" type="POSITION"/>
</Condition>
我想把这个解析为
Temperature = Normal
Load - Normal
我所做的是
foreach ($xml->xpath("//n:Condition")->children("n") as $child) {
echo $child["type"] . "=" . $child->getName();
}
我得到以下错误
Fatal error: Call to a member function children() on a non-object in C:'xampp'htdocs'DataDumper'datadumper'test.php on line 53
现在我知道这与我查询xpath或其他东西的方式有关,我尝试了各种组合,例如在查询中添加*斜杠,但每次都出现相同的错误。
不确定为什么首先使用名称空间符号(示例xml没有名称空间)
在xpath中,您需要选择所有condition/normal
标记,而不是像您所做的那样选择condition
标记…同样,xpath()
返回一个列表,所以foreach
遍历它。您不需要将其作为子节点访问,除非您想解析$child
的子节点。这样就说得通了,它就会像预期的那样工作。
foreach ($xml->xpath("/Condition/Normal") as $child) {
echo $child["type"] . "=" . $child->getName()."<br/>";
}
输出TEMPERATURE=Normal
LOAD=Normal
POSITION=Normal
问题是由于SimpleXMLElement::xpath()
返回一个数组而不是SimpleXMLElement
。我也不确定XPath查询中是否支持名称空间,但我确信您可以通过摆弄它来解决这个问题。在任何情况下,我在XML中没有看到n
名称空间。
答案实际上取决于您希望有多少元素与XPath查询匹配。如果只有一个,试试
$conditions = $xml->xpath('//Condition');
if (count($conditions) == 0) {
throw new Exception('No conditions found');
}
$condition = $conditions[0];
foreach ($condition->children() as $child) {
printf('%s = %s', (string) $child['type'], $child->getName());
}