按属性名称获取XML值

时间:2012-08-16 19:16:12

标签: php xml simplexml ncbi

  

可能重复:
  Attribute Value Selection in SimpleXML
  SimpleXML: Selecting Elements Which Have A Certain Attribute Value

我正在解析XML文档并查找特定ID。 ID值在属性“pii”下的ArticleId元素中提供。原始XML:

<ArticleIdList>
    <ArticleId IdType="pubmed">12676398</ArticleId>
    <ArticleId IdType="pii">S0020729202004460</ArticleId>
</ArticleIdList>

以下是整个文档供参考:http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=12676398&retmode=xml&rettype=abstract

使用simplexml_load_file(),我正在遍历文档以获取值。这是我如何进入ArticleId元素:

$xml_PubmedArticle->PubmedData->ArticleIdList->ArticleId;

问题是ArticleId中的属性是按顺序随机的。一些ArticleId元素在第二个元素中包含“pii”值(如下所示),其他记录在第二个元素中具有不同的属性(“doi”)。

SimpleXMLElement Object
(
    [ArticleId] => Array
        (
            [0] => 12676398
            [1] => S0020729202004460
        )
)

变异:

SimpleXMLElement Object
(
    [ArticleId] => Array
        (
            [0] => 1234
            [1] => ABC123
            [2] => S002012345678
        )
)

我正在寻找“S0002 ...”ID,它在原始XML中通过属性“pii”标识。

我应该如何根据特定属性检查/获取值?

2 个答案:

答案 0 :(得分:3)

有几种方式:

foreach ($xml_PubmedArticle->PubmedData->ArticleIdList->ArticleId as $id) {
   foreach ($id->attributes() as $name => $value) {
      if ($value == 'pii') {
         //FOUND!
      }
   }
}

..或简单的xpath

$xml_PubmedArticle->xpath('PubmedData/ArticleIdList/ArticleId[@IdType="pii"]');

更具体的xpath更快。

另请注意,第一个选项只会迭代 first ArticleIdList,因为XPath将返回它找到的所有项目的数组。

答案 1 :(得分:1)

您可以使用xpath

按属性的值访问特定元素
echo $xml_PubmedArticle->xpath('//ArticleIdList/ArticleId[@IdType="pii"]')[0];

另请参阅手册中的Basic SimpleXML Usage

相关问题是:simplexml, returning multiple items with the same tag