Получить значение XML по имени атрибута

Возможные дубликаты:
выбор значения атрибута в SimpleXML
SimpleXML: выбор элементов, имеющих определенное значение атрибута

Я анализирую XML-документ и ищу определенный идентификатор. Значение идентификатора указывается в элементе ArticleId в атрибуте «pii». Необработанный 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...", который идентифицируется в необработанном XML атрибутом "pii".

Как мне проверить/получить значение на основе определенного атрибута?


person a coder    schedule 16.08.2012    source источник
comment
Я ценю отзывы от salathe, PeeHaa, hakra, Jurgen и J0k, но надеюсь, что они осознают разницу в том, как задается этот вопрос, и в том, как был задан упомянутый вопрос. Сюда входят примеры, а также исходный XML-файл, чтобы другие могли более четко понять проблему. Упомянутый вопрос не дает фона - только читая ответы, мы видим, что он похож на этот вопрос. Упомянутый вопрос не возник в моем первоначальном поиске StackOverflow.   -  person a coder    schedule 21.08.2012
comment
Да, возможно, это был не лучший выбор, но есть и другой вариант, который близок к этому и теперь также имеет перекрестные ссылки: SimpleXML: выбор элементов, имеющих определенное значение атрибута (июнь 2009 г.). Спасибо за ваш отзыв.   -  person hakre    schedule 09.07.2013
comment
Я чувствую, что наличие первого заданного вопроса не обязательно делает его лучшим общим вопросом для этой конкретной темы/проблемы. Я ценю продолжение.   -  person a coder    schedule 09.07.2013


Ответы (2)


Пара способов:

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"]');

Более конкретные xpaths работают быстрее.

Также обратите внимание, что первый вариант будет перебирать только first ArticleIdList, где XPath вернет массив всех найденных элементов.

person Explosion Pills    schedule 16.08.2012

Вы можете получить доступ к определенному элементу по значению атрибута, используя xpath:

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

См. также Основное использование SimpleXML в руководстве.

Связанный с этим вопрос: simplexml, возвращающий несколько элементов с одним и тем же тегом

person hakre    schedule 16.08.2012