SimpleXML get element content based on attribute v

2019-01-09 12:05发布

This question already has an answer here:

I'm trying to access the content of an element based on the value of an attribute. With PHP SimpleXML. I've got the following XML setup:

<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>

These are books. In this case I'm trying to get the title. What I have so far is this:

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

Where the comment is I tried a lot of things.

2条回答
beautiful°
2楼-- · 2019-01-09 12:53

This XPath query on the SimpleXML object will return all DocSum nodes that have an Item child with value "Author" in the Name attribute and value "Olivera GC" in the text node:

$nodes = $xml->xpath('//DocSum[Item[@Name="Author" and .="Oliveira GC"]]');
$book = $nodes[0];
print_r($book);
查看更多
淡お忘
3楼-- · 2019-01-09 12:59

Well, I suspect the solution will be XPATH...

If you're trying to get the title of a book by the id, you'd use the query:

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

If you're trying to search for the title of a book:

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

Then just run it:

$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
}

I'm converting back and forth between simplexml and domdocument since that appears to be the only documented way of traversing up the tree...

查看更多
登录 后发表回答