2010-03-04 47 views
2

我需要查询xml文档,然后显示特定的标记值,例如,姓氏,姓氏,组(部门),job_title。使用XMLReader,DOM,Xpath获取给定节点的标记名称和值

我正在使用XMLReader,因为我可能需要使用大型XML文件。我使用DomXPath来过滤数据,但我不知道如何检索每个元素的nodeName和值。下面的代码仅返回'member'作为节点名称?

任何帮助,将不胜感激。

<?php 
    $reader = new XMLReader(); 
    $reader->open('include/staff.xml'); 

    while ($reader->read()){ 
     switch($reader->nodeType){ 
      case(XMLREADER::ELEMENT): 
       if($reader->localName === 'staff'){ 
        $node = $reader->expand(); 
        $dom = new DomDocument(); 
        $dom->formatOutput = true; 
        $n = $dom->importNode($node, true); 
        $dom->appendChild($n); 
        $xp = new DomXpath($dom); 
        $res = $xp->query("/staff/member[groups='HR']"); 
       } 
     } 
    } 
    echo $res->item(0)->nodeName; 
    echo $res->item(0)->nodeValue; 
?> 

回答

1

还是有点粗糙,但是这是我后我。我发现我的xpath查询导致了这个问题。

<?php 
$reader = new XMLReader(); 
$reader->open('include/staff.xml'); 
$keywords = ''; 
$query = "//member[groups='Research'][contains(translate(forename,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') ,'$keywords') or contains(translate(surname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), '$keywords')]/*"; 
while ($reader->read()){ 
    switch($reader->nodeType){ 
     case(XMLREADER::ELEMENT): 
      if($reader->localName === 'staff'){ 
       $node = $reader->expand(); 
       $dom = new DomDocument(); 
       $dom->formatOutput = true; 
       $n = $dom->importNode($node, true); 
       $dom->appendChild($n); 
       $xp = new DomXpath($dom); 
       $results = $xp->query($query); 
      } 
    } 
} 
$member = array(); 
$staff = array(); 
echo $results->length; 
for($i=1; $i<$results->length; $i++){ 
    if($results->item($i)->nodeName !== 'id'){ 
     $member[$results->item($i)->nodeName] = $results->item($i)->nodeValue; 
    }else{ 
     array_push($staff, $member); 
    } 
} 
array_push($staff, $member); 
var_dump($staff); 

?>

0

根据http://www.php-editors.com/php_manual/ref.xmlreader.html

这个网页,请

$reader->name 

$reader->value 

他们应该是“节点的限定名称”和“节点的文本值”

显然这就是人们如何使用它:http://www.google.com/codesearch/p?hl=pl#_rn0kgFhkQA/redir/docvert/60463/url_tgz/docvert-3.2.3.tar.gz%7CP-uLGAoGHyM/docvert/core/process/ParseOpenDocument.php&q=xmlreader%20file:%5C.php $

也许更多的使用的例子可以在这里找到:http://www.google.com/codesearch?q=xmlreader+file:.php $

+0

是将这些值不基于XMLReader的?我使用DOM和XPath,所以我想我需要使用DOM方法,例如$ res-> item(1) - > nodeValue;得到我的过滤结果。 尝试了$ reader-> name ...无论如何没有返回。 – rossjha 2010-03-04 11:53:02

+0

这应该是XMLReader类的属性。我想你应该在$ reader-> name下面看到一些东西。试试一些最简单的例子。 – 2010-03-04 12:27:14

+0

嗨,感谢您的帮助。我想我已经明白了。我的查询是问题。一旦我掌握了xpath,我就能够为每个标签返回nodeName和nodeValue。 – rossjha 2010-03-04 21:25:06

相关问题