2

我需要查询一个 xml 文档,然后显示特定的标记值,例如名字、姓氏、组(部门)、工作职位。

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

任何帮助,将不胜感激。

<?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;
?>
4

2 回答 2

2

仍然有点粗糙,但这就是我所追求的。我发现我的 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);

?>

于 2010-03-04T21:26:48.997 回答
0

尝试

$reader->name

$reader->value

根据此页面http://www.php-editors.com/php_manual/ref.xmlreader.html ,它们应该是“节点的限定名称”和“节点的文本值”

显然这就是人们使用它的方式: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 $

于 2010-03-04T10:18:00.090 回答