2010-06-04 65 views
0

我得到這個錯誤:XPath和PHP故障排除

Notice: Trying to get property of non-object in 

適用於: 回聲$ result->數據;

而這種輸出:

Array() 

背景信息

函數返回一個包含XML文件的字符串。

我想從兩個標籤中獲取一些數據並自行處理它們。

字符串數據

$data=" 
<SyncML xmlns='SYNCML:SYNCML1.0'> 
<SyncHdr> 
</SyncHdr> 
<SyncBody> 
    <betameta> 
     WANT 1 
    </betameta> 
    <Add> 
     <Data> 
     WANT 2 
     </Data> 
    </Add> 
</SyncBody> 
</SyncML>"; 

在上述的數據,我想值 「WANT 1」 和 「WANT 2」

代碼到目前爲止

$xml = simplexml_load_string($data); 
$result = $xml->xpath("/SyncML/SyncBody"); 
print_r($result); 
echo $result->Data; 

回答

-1

我能找到的唯一解決辦法是:

<?php 

$data= <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
<SyncML> 
<SyncHdr> 
</SyncHdr> 
<SyncBody> 
    <betameta> 
     WANT 1 
    </betameta> 
    <Add> 
     <Data> 
     WANT 2 
     </Data> 
    </Add> 
</SyncBody> 
</SyncML> 
XML; 

$xml = simplexml_load_string($data); 
$result = $xml->xpath("/SyncML/SyncBody"); 
print_r($result); 
echo $result; 

反正是有,你可以鬆的xmlns?

這將輸出:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [betameta] => 
     WANT 1 

      [Add] => SimpleXMLElement Object 
       (
        [Data] => 
     WANT 2 

       ) 

     ) 

) 
+0

太棒了!我將砍掉xmlns! 謝謝,馬丁! – Sochin 2010-06-04 14:45:24

+0

@Sochin:我不會推薦這個。處理命名空間,這很容易(見Rik的答案)。 – Tomalak 2010-06-04 15:01:26

0

卸下尾隨斜線。

+0

謝謝,這樣做,現在我得到「陣列()」 – Sochin 2010-06-04 14:24:12

+0

是的,你的數組中獲取物品0讓你的唯一的結果。 – 2010-06-04 14:26:14

+0

我正在使用:print_r($ result); 不是輸出數組中的所有條目嗎? – Sochin 2010-06-04 14:28:20

2
$xml->registerXPathNamespace('default','SYNCML:SYNCML1.0'); 
$result = $xml->xpath("/default:SyncML/default:SyncBody"); 
+0

+1,比從源頭上踢出名字空間好得多。 – Tomalak 2010-06-04 14:58:46