【问题标题】:Iterate through DOM document with PHP使用 PHP 遍历 DOM 文档
【发布时间】:2014-09-05 23:32:01
【问题描述】:

我只是试图通过遍历它来获取 PHP 中 XML 文件的所有节点名称。这是我的尝试:

$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->loadXML("<?xml version='1.0' encoding='ISO-8859-1'?><user><name>Michael Taylor</name><offers>0</offers><address><street>Ringstreet 8</street><zip>1100</zip><city>Norther</city></address><credit>473.43</credit></user>");
$node = $doc->firstChild;

function iterateXML($node) {
    if($node->childNodes->length == 0) {
        echo $node->nodeName;
        return;
    }
    $children = $node->childNodes;
    foreach($children as $child) {
        iterateXML($child);
    }
}
iterateXML($node);

但是,输出是

#text#text#text#text#text#text 

我做错了什么?

编辑:

我的最终计划是将子节点的名称添加到以“_”分隔的父节点的名称中,因此上例的最终输出应该是:

name
offers
address_street
address_zip
address_city
credit

最简单的方法是什么?

【问题讨论】:

    标签: php xml domdocument


    【解决方案1】:

    不仅元素是节点。您输出没有子节点的节点的名称。在您的 XML 中仅作为文本节点。

    您可以检查节点类型...或使用 XPath:

    $xml = <<<'XML'
    <?xml version='1.0' encoding='ISO-8859-1'?><user><name>Michael Taylor</name><offers>0</offers><address><street>Ringstreet 8</street><zip>1100</zip><city>Norther</city></address><credit>473.43</credit></user>
    XML;
    
    $dom = new DOMDocument();
    $dom->loadXml($xml);
    $xpath = new DOMXPath($dom);
    
    foreach ($xpath->evaluate('//*[count(*) = 0]') as $node) {
      var_dump($node->nodeName);
    }
    

    * 匹配元素节点,//* 表示文档中的任何元素节点,[count(*) = 0] 限制为没有子元素节点的节点。

    输出:

    string(4) "name"
    string(6) "offers"
    string(6) "street"
    string(3) "zip"
    string(4) "city"
    string(6) "credit"
    

    【讨论】:

    • 很好,但是 XPath 是否也可以将子节点的名称添加到父节点的名称中? (见编辑过的OP)
    • 这里有几种方法可以做到这一点。节点具有 parentNode 属性。这里是可以使用的 XPath 中的 ancestorparent 轴。但是如果你仔细想想name 有一个父节点user。 XML 到数组的通用转换在大多数情况下是错误的。通过直接使用 Xpath 读取 XML,您丢失了仍然可以使用的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2014-01-09
    • 2010-09-21
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多