2016-12-07 128 views
0

我有下面的XML:PHP SimpleXMLElement對象獲取數據

<Root> 
    <personalData> 
     <userName>John Tom</userName> 
     <email>[email protected]</email> 
    </personalData> 
    <profesionalData> 
     <job>engineer</job> 
     <jobId>16957</jobId> 
    </profesionalData> 
</Root> 

在我的調試器做:

$myObject->xpath('//Root/profesionalData') 

我:

: array = 
    0: object(SimpleXMLElement) = 
    job: string = engineer  
    jobId: string = 16957 

我不能得到jobId的保持16957

我有什麼做的?

+0

嘗試'$ myObject->的XPath( '//根/ profesionalData')[0] - > jobId' –

回答

1
$root = simplexml_load_file('file.xml'); 


$job_ids = $root->xpath('//profesionalData/jobId'); 

if (!$job_ids) { 
    die("Job IDs not found"); 
} 

foreach ($job_ids as $id) { 
    // SimpleXmlElement implements __toString method, so 
    // you can fetch the vlaue by casting the object to string. 
    $id = (string)$id; 
    var_dump($id); 
} 

樣本輸出

string(5) "16957" 

注意

你不需要在XPath表達式指定Root,如果你要獲取所有profesionalData/jobId標籤無論身在何處他們在文檔中,只需使用雙斜槓(//)表達式。如果您想避免註冊XML名稱空間,這種方法可能很方便。否則,您可以使用嚴格的表達式,如/Root/profesionalData/jobId(根路徑)。順便說一句,您的當前表達式(//Root/profesionalData/jobId)的/Root/profesionalData/jobId所有出現相匹配的文件中,例如/x/y/z/Root/profesionalData/jobId

由於SimpleXmlElement::xpath函數成功返回一個數組,或者在故障時返回FALSE,如果它是非空數組,則應該用循環迭代該值。

SimpleXmlElement實現__toString方法。該方法在對象出現在字符串上下文中時調用。特別是,你可以cast對象爲字符串,以獲取節點的字符串內容。

+0

呃..這將永遠是因爲你的'if'的失敗! –

+1

@PraveenKumar,謝謝。固定 –

+0

第一個音符是錯誤的。 '//'不指向'Root'元素,但它是對其父節點的引用(在這種情況下)。位置路徑開始處的'/'指向文檔本身,'//'是後代軸。所以'//根/ profesionalData'將尋找是一個'Root'元素節點的直接子任何'profesionalData'元素節點。 – ThW