2011-09-02 77 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