通过属性名获取XML值

3

我正在解析一个XML文档,寻找特定的ID。该ID的值在属性"pii"下的ArticleId元素中提供。原始的XML如下:

可能的重复问题:
SimpleXML中的属性值选择
SimpleXML:选择具有特定属性值的元素

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

我正在寻找标识为“pii”的原始XML中的“S0002…” ID。您应该如何检查/获取特定属性的值?

我感谢salathe、PeeHaa、hakra、Jurgen和J0k的反馈,但希望他们能认识到这个问题的提问方式与被引用问题的提问方式之间的区别。这包括示例以及一个源XML文件,以便其他人更清楚地理解问题。被引用的问题没有提供任何背景信息——只有通过阅读答案,我们才看到它与这个问题相似。在我的原始StackOverflow搜索中没有出现被引用的问题。 - a coder
是的,也许这不是最好的选择,但还有另一个选择非常接近,并且现在也已经交叉链接了:SimpleXML: Selecting Elements Which Have A Certain Attribute Value (Jun 2009)。感谢您的反馈。 - hakre
我的感觉是,第一个提出的问题并不一定是针对特定主题/问题的最佳整体问题。我感激你的后续跟进。 - a coder
2个回答

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查询速度更快。
另外请注意,第一种选项只会迭代第一个ArticleIdList,而XPath将返回它找到的所有项目的数组。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接