在PHP中查找子节点


finding children in php simplexml xpath

我正在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());
}