plgkm6 2019-04-01 16:53 采纳率: 0%
浏览 790

PHP DOMDocument如何遍历所有节点并获取name、value(如果有)、attributes(键值对)?

假设一个未知XML/HTML字符串/文件$doc对象,根节点未知。
假设一个结构体:

class NodeInfo {
    public $name = '';
    public $value = null; //如果没有儿子节点且不是空节点,否则都是null
    public $attributes = []; //key=>value
    public $children = []; //NodeInfo[]
}

如何遍历$doc然后存储到一个NodeInfo中?

我试着用$doc->childNodes获取所有子节点,然后遍历,如果hasChildNodes就继续递归这个函数(函数还没写,我直接在PHPUnit中一个一个循环试了一遍),但是发现几个问题:

1. 根节点遍历了两遍
2. 属性名、节点类型(#text)也都遍历出来了,显然我一脸懵逼,这玩意定义上是node不错但是我是打算在一个node或者element上单独获取的呀?
3. element和node啥区别?不是定义上,是指php中如何区分?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 17:07
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要遍历DOM文档中的元素和文本节点,你可以使用$doc->getElementsByTagName()方法。这是一个用于查找具有特定标签名称的所有节点的方法。如果你想要遍历所有的节点,你可以使用$doc->getElementsByTagName('*')来找到所有匹配的节点。接下来,你可以通过递归地调用你的函数来访问这些节点。

    以下是一个简单的示例,它会打印出每个节点的名字、值以及属性:

    <?php
    
    function printNode($node, $prefix='') {
        echo "<{$node->nodeName}{$prefix}>";
    
        foreach ($node as $child) {
            printNode($child);
        }
    
        echo "</{$node->nodeName}{$prefix}>";
    }
    
    // 假设你有一个DOM Document对象 $doc
    echo '<pre>';
    printNode($doc);
    
    ?>
    </pre>
    

    在这个例子中,我们首先创建了一个名为printNode的函数,它接受一个DOM节点和一个前缀作为参数。然后,我们递归地调用这个函数,以访问每个节点的孩子节点。

    请注意,为了确保安全,你应该避免直接访问DOM节点的值或属性,因为它们可能包含敏感信息。相反,你可以尝试通过检查节点是否为nullfalse来确定它们是否存在。例如:

    if (!$node->nodeValue || !$node->getAttribute('attributeName')) {
        // 这些节点没有值或属性
    }
    

    此外,如果你正在处理的是大量数据,你可能希望考虑使用缓存或迭代器来优化性能。

    评论

报告相同问题?