如何通过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:
答案 0 :(得分:4)
一种方法:
$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: