2010-03-04 74 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

相關問題