Как получить атрибут каждого узла через xpath - PullRequest
1 голос
/ 09 ноября 2011

Как я могу получить атрибут каждого узла через xpath?

Например,

book.xml

<?xml version="1.0" encoding="UTF-8" ?>
<records timestamp="1264777862">
<record></record>
<record></record>
<record timestamp="1264777000"></record>
<record></record>
</records>

PHP

<?php

$doc = new DOMDocument;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

# get and output "<entry>" elements
$x = $doc -> getElementsByTagName('record');

# Count the total feed with xpath.
$total = $x->length;

# the query is relative to the records node
$query = 'string(/records/@timestamp)';

for ($i=0; $i<$total; $i++)
{
    $timestamp = $xpath->evaluate($query,$x->item($i));
    echo $timestamp ."<br/>";
}

?>

результат (который он зацикливает только на первом узле),

1264777862
1264777862
1264777862
1264777862

Но я хочу получить,

1264777862
1264777000

Я следовал за вопросом и ответом здесь и изменил его.

Или, может быть, есть лучшие методы?

EDIT:

XML

<?xml version="1.0" encoding="UTF-8" ?>
<records>
    <record timestamp="1264777862">A</record>
    <record>B</record>
    <record timestamp="1264777000">C</record>
    <record>D</record>
</records>

с этим,

for ($i=0; $i<$total; $i++)
{
    $value = $x->item($i)->childNodes->item(0)->nodeValue;
    $timestamp = $xpath->evaluate($query,$x->item($i));
    echo $value.': '.$timestamp ."<br/>";
}

Я получаю этот результат,

A: 1264777862
B: 1264777862
C: 1264777862
D: 1264777862

но это результат, которого я добиваюсь,

A: 1264777862
B: 
C: 1264777862
D: 

EDIT:

тест,

$nodes = $xpath->query('//records/record');

foreach($nodes as $node) {
    $value = $node->nodeValue;
    $timestamp = $node->getAttribute('timestamp');
    echo $value .': '."<br/>";
}

результат

A: 
B: 
C: 
D: 

1 Ответ

4 голосов
/ 09 ноября 2011

Один метод:

$nodes = $xpath->query('//records[@timestamp]');
foreach($nodes as $node) {
    $timestamp = $node->getAttribute('timestamp');
}

Хотя в вашем примере вы смешали record и records, поэтому я не уверен, что вы используете в действительности.


обновление: у меня работает этот код:

<?php

$xml = <<<EOL
<?xml version="1.0" encoding="UTF-8" ?>
<records>
    <record timestamp="1264777862">A</record>
    <record>B</record>
    <record timestamp="1264777000">C</record>
    <record>D</record>
</records>
EOL;

$x = new DOMDocument();
$x->loadXML($xml);

$xp = new DOMXpath($x);

$nodes = $xp->query('//records/record');
foreach($nodes as $node) {
   echo $node->nodeValue, ': ', $node->getAttribute('timestamp'), "\n";
}

и выходы

A: 1264777862
B:
C: 1264777000
D:
...