2011-09-02 45 views
1

我正在xml流上运行xpath查询并检索一组数据。在这我需要找到标签名称。但我不能找到检索标签名称的方式。 XML流是在php中查找孩子simplexml xpath

<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的方式或者其他方法,我尝试了各种组合方式,例如为查询添加*斜杠,但每次都会出现相同的错误。

回答

3

不知道为什么你在第一时间使用命名空间notaion(示例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 
+0

我的印象中OP不知道子元素的标签名称在这种情况下, ,这只适用于''子女 – Phil

+2

实际的XML有命名空间,这就是为什么我在这里添加它。另外我不能做/条件/正常,因为正常不是静态的,它可以改变,但我改变它/条件/ *,它的工作原理!谢谢 – swordfish

1

问题是由于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()); 
} 
+0

请再次检查所编辑的问题 – swordfish

+0

@swordfish我已经更新了我的答案 – Phil