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
}
В комментариях я пробовал много вещей.
Ответы
Ответ 1
Этот XPath запрос на объект SimpleXML вернет все узлы DocSum
, у которых есть дочерний элемент Item
со значением "Автор", в атрибуте Name
и значении "Olivera GC" в тексте node:
$nodes = $xml->xpath('//DocSum[Item[@Name="Author" and .="Oliveira GC"]]');
$book = $nodes[0];
print_r($book);
Ответ 2
Хорошо, я подозреваю, что решение будет 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, поскольку это единственный документированный способ перемещения дерева...