SimpleXML получает содержимое элемента на основе значения атрибута

Я пытаюсь получить доступ к содержимому элемента на основе значения атрибута. С PHP SimpleXML. У меня есть следующая настройка XML:

<DocSum> <Id>21242919</Id> <Item Name="Author" Type="String">Nguyen T</Item> <Item Name="Title" Type="String">[Hemoptysis and spontaneous rupture of a primary renal angiosarcoma: a case report.]</Item> </DocSum> <DocSum> <Id>21242919</Id> <Item Name="Author" Type="String">Oliveira GC</Item> <Item Name="Title" Type="String">Disclosing ambiguous gene aliases by automatic literature profiling.</Item> </DocSum> <DocSum> <Id>21242919</Id> <Item Name="Author" Type="String">Vanderwall DE</Item> <Item Name="Title" Type="String">Metformin and digestive disorders.</Item> </DocSum> 

Это книги. В этом случае я пытаюсь получить название. До сих пор я так:

 $xml = simplexml_load_file(url); $docs = $xml->DocSum; foreach($docs as $book){ // Each book individual } 

Где комментарий, я пробовал много чего.

Этот запрос XPath на объекте SimpleXML вернет все узлы DocSum , у которых есть дочерний Item со значением «Автор» в атрибуте Name и значением «Olivera GC» в текстовом узле:

 $nodes = $xml->xpath('//DocSum[Item[@Name="Author" and .="Oliveira GC"]]'); $book = $nodes[0]; print_r($book); 

Ну, я подозреваю, что решение будет XPATH

Если вы пытаетесь получить название книги по id, вы должны использовать запрос:

 $query = '//DocSum/Id[contains(., "21232919")]'; 

Если вы пытаетесь найти название книги:

 $query = '//DocSum/Item[@Name="Title" AND contains(., "Metformin")]'; 

Затем просто запустите его:

 $xml = simplexml_load_file($url); $results = $xml->xpath($query); foreach ($results as $titleElement) { $book = simplexml_import_dom(dom_import_simplexml($titleElement)->parentNode); // Handle the book here } 

Я перехожу назад и вперед между simplexml и domdocument, поскольку это единственный документированный способ перемещения по дереву …