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
}

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

2 ответов


этой 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, так как это, по-видимому, единственный документированный способ обхода дерева...