PHP Xpath извлекает значение для узла с атрибутом name = "author" - PullRequest
3 голосов
/ 16 мая 2011

Я пытаюсь проанализировать некоторые XML-данные, чтобы получить значение определенного атрибута - в частности, я хочу найти автора. Ниже приведен очень урезанный, но действительный пример. Узел R повторяется несколько раз.

<GSP VER="3.2">
    <RES SN="1" EN="10">
        <R N="4" MIME="application/pdf">
            <Label>_cse_rvfaxixpaw0</Label>
            <PageMap>
                <DataObject type="metatags">
                    <Attribute name="creationdate" value="D:20021024104222Z"/>
                    <Attribute name="author" value="Diana Van Winkle"/>
                </DataObject>
            </PageMap>
        </R>
    </RES>
</GSP>

В настоящее время я делаю:

$XML = simplexml_load_string($XMLResult);
$XMLResults = $XML->xpath('/GSP/RES/R');
foreach($XMLResults as $Result) {
    $Label = $Result->Label;
    $Author = ""; // <-- How do I get this?
}

Может кто-нибудь объяснить мне, как я могу вытащить атрибут "автор"? Атрибут author будет присутствовать максимум 1 раз, но может отсутствовать вообще (я могу справиться сам)

Ответы [ 2 ]

4 голосов
/ 16 мая 2011

Вот решение.По сути, вы можете сделать вызов XPath из узла результатов, чтобы получить все элементы атрибута с атрибутом name, равным author.

Затем вы проверяете и убедитесь, что результат вернулся, и если он это сделал, он будет индексирован.[0], поскольку вызовы XPath возвращают массив результатов.Затем вы используете функцию attributes(), чтобы получить ассоциированный массив атрибута, и, наконец, получить желаемое значение.

$XML = simplexml_load_string($xml_string);
$XMLResults = $XML->xpath('/GSP/RES/R');
foreach($XMLResults as $Result) {
    $Label = $Result->Label;
    $AuthorAttribute = $Result->xpath('//Attribute[@name="author"]');
    // Make sure there's an author attribute
    if($AuthorAttribute) {
      // because we have a list of elements even if there's one result
      $attributes = $AuthorAttribute[0]->attributes();
      $Author = $attributes['value'];
    }
    else {
      // No Author
    }
}
2 голосов
/ 16 мая 2011
$authors = $Result->xpath('PageMap/DataObject/Attribute[@name="author"]');
if (count($authors)) {
    $author = (string) $authors[0]['value'];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...