2013-04-29 146 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