如何通过xpath获取每个节点的属性

时间:2011-11-09 15:48:15

标签: php xml xpath domdocument

如何通过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

我已经按照here的问题和答案进行了修改。

或许有更好的方法?

修改

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: 

修改

测试,

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

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

结果,

A: 
B: 
C: 
D: 

1 个答案:

答案 0 :(得分:4)

一种方法:

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

尽管如此,您在示例中混合了recordrecords,所以我不确定您实际使用的是哪个。


更新:此代码适用于我:

<?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: