Loop over DOMDocument

2022-08-30 17:08:39

我正在遵循这个问题的建议 健壮的,成熟的HTML解析器 PHP,关于解析可能与DOMDocument格式错误的html。

有没有简单的方法来遍历解析的文档?所以我想像这样循环使用html。

$html='<ul>
         <li>value1</li>
         <li>value1</li>
         <li>value3
            <p>subvalue</p>
         </li>
        </ul>
        <p>hello world</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);
???
foreach (??? as $node)
{
  print $node->nodeName.':'.$node->nodeValue;
}

并得到类似这样的结果。

 ul:
 li:value1
 li:value2
 li:value3
 p:subvalue
 p:hello world

使用本身并不能真正做到我想要的。因为它似乎没有下降到树的低枝。我使用了halfdan建议的代码,我得到了这样的结果。$doc->childNodes

html:
html:value1
         value1
         value3
            subvalue

        hello world

答案 1

试试这个:

$doc = new DOMDocument();
$doc->loadHTML($html);
showDOMNode($doc);

function showDOMNode(DOMNode $domNode) {
    foreach ($domNode->childNodes as $node)
    {
        print $node->nodeName.':'.$node->nodeValue;
        if($node->hasChildNodes()) {
            showDOMNode($node);
        }
    }    
}

答案 2

我在具有c数据的元素中遇到了问题,即使没有子元素的元素也返回了它们。

我不知道为什么会这样。

我发现的解决方法是改变

if($node->hasChildNodes()) {
        showDOMNode($node);
    }

if($node->childNodes->length != 1) {
        showDOMNode($node);
    }

代码现在工作得很好。


推荐