【问题标题】:Get tag name and value of a given node using XMLReader, DOM, Xpath使用 XMLReader、DOM、Xpath 获取给定节点的标签名称和值
【发布时间】:2010-03-04 09:52:47
【问题描述】:

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

我正在使用 XMLReader,因为我可能需要处理大型 XML 文件。我使用 DomXPath 过滤数据,但我不知道如何检索每个元素的节点名称和值。下面的代码只返回'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;
?>

【问题讨论】:

    标签: php dom xpath xmlreader


    【解决方案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);
    

    ?>

    【讨论】:

      【解决方案2】:

      试试

      $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$

      【讨论】:

      • 这些值不会基于 XMLReader 吗?我正在使用 DOM 和 XPath,所以我认为我需要使用 DOM 方法,即 $res->item(1)->nodeValue;得到我的过滤结果。无论如何尝试了 $reader->name... 并没有返回任何内容。
      • 这应该是 XMLReader 类的属性。我想你应该在 $reader->name 下看到一些东西 在一些最小的例子上试试。
      • 您好,感谢您的帮助。我想我明白了。我的查询是问题所在。一旦我掌握了 xpath,我就能够为每个标签返回 nodeName 和 nodeValue。
      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2021-07-29
      • 2017-05-27
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多