2013-04-29 182 views
0

我想循環遍歷每個book_list在以下xml文件中,併爲每個book_list循環每個書book_list。php和xpath - 通過特定元素的子元素循環

<inventory> 
<book_list> 
<book> 
<author>Rowling</author> 
<title>Harry Potter</title> 
</book> 
<book> 
<author>Blyton</author> 
<title>Famous 5</title> 
</book> 
</book_list> 
<book_list> 
<book> 
<author>Bloggs</author> 
<title>Learning XML</title> 
</book> 
<book> 
<author>Jones</author> 
<title>Beginning PHP</title> 
</book> 
</book_list> 
</inventory> 

對於每個book_list,我如何使用php simplexml腳本中的xpath遍歷每本書?這裏是我的代碼,

$booklistpath = $xml->xpath('//booklist'); 

foreach($booklistpath as $booklist){ 

    $bookpath = $xml->xpath('//book'); 

    foreach($bookpath as $book){ 

    ... 
    } 
} 

第一個循環是好的,它通過每個book_list - 但嵌套循環,其目的是要通過每本書針對特定book_list經過每本書的整個文件內。我也試過: -

'.//book' and 
'descendant::book' 

回答

3

,既然你使用原始$xml第二xpath調用,它是爲SimpleXMLElement爲您的整個XML文檔的正確的結果。

要獲取圖書書目每個迭代只是它們如下:

$booklists = $sxe->xpath('//book_list'); 

foreach ($booklists as $booklist) { 
    foreach ($booklist->book as $book) { 
     echo $book->asXML(); 
    } 
} 
+0

感謝您的幫助 - 任何想法如何做到這一點時,有一個命名空間?我的真實數據有一​​個命名空間這樣的: - 這需要 的foreach($ booklist-> NS:本書作爲$書){等 這會導致一個PHP解析錯誤 – lorac 2013-04-29 16:28:05

+0

當然,使用* * [SimpleXMLElement :: registerXPathNamespace](http://php.net/manual/en/simplexmlelement.registerxpathnamespace.php)**函數。看看這個來加快速度:http://stackoverflow.com/questions/595946/parse-xml-with-namespace-using-simplexml。 – 2013-04-29 16:33:25

+1

使用' - > children()'方法選擇名稱空間;在你的示例'foreach($ booklist-> children('ns',true) - > book as $ book)'中。在這種情況下,不需要XPath,這正是SimpleXML訪問方法所做的。 – IMSoP 2013-04-29 19:47:52