2011-11-09 67 views
1

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

例如,

是book.xml,

​​

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

你的XML对'records',一个在'record'的属性。你想和谁一起工作? –

+0

对不起,我的错误。请参阅我上面的编辑。谢谢。 – laukok

回答

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: 
+0

对不起,我的错误。请参阅我上面的编辑。我用'getAttrribute'得到一个错误信息,谢谢。 – laukok

+0

woops。错字。应该是getAttribute(一个r)。 –

+0

对不起,我刚刚意识到另一个问题,因为我需要结果中的更多信息。我不能在你的答案中使用查询。你能看到我上面的修改吗?谢谢。 – laukok

相关问题