SimpleXML基于属性值获取元素内容

时间:2011-01-19 14:34:10

标签: php css-selectors 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 个答案:

答案 0 :(得分:20)

对SimpleXML对象的此XPath查询将返回DocSum属性中具有Item子级值为“作者”的所有Name个节点和值“Olivera GC “在文本节点中:

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

答案 1 :(得分:5)

好吧,我怀疑解决方案是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之间来回转换,因为这似乎是遍历树的唯一记录方式......