php DOMDocument:html到节点树

php DOMDocument:html到节点树,php,html,html-parsing,domdocument,Php,Html,Html Parsing,Domdocument,此函数用于将html转换为节点树(结构)。但是,每个节点都作为前一个节点的子节点返回,即使该节点是当前节点的同级节点 $xml = ' <div> <div> <b></b> </div> <p></p> </div> '; function xml2array($xml,&$result = '') { foreach($xml->c

此函数用于将html转换为节点树(
结构)。但是,每个节点都作为前一个节点的子节点返回,即使该节点是当前节点的同级节点

$xml = '
<div>

   <div>
       <b></b>
   </div>

   <p></p>

</div>
';


function xml2array($xml,&$result = '') {

    foreach($xml->children() as $name => $xmlchild) {
         xml2array($xmlchild, $result);

    }
    $result = "<ul><li>".$xml->getName().$result."</li></ul>";

}


$result='';
$dd = xml2array(simplexml_load_string($xml), $result);


echo "<pre>";
print_r($result);
$xml='1!'

'; 函数xml2array($xml,&$result=''){ foreach($xml->children()作为$name=>$xmlchild){ xml2array($xmlchild,$result); } $result=“
  • ”$xml->getName().$result。”
”; } $result=''; $dd=xml2array(simplexml\u load\u字符串($xml),$result); 回声“; 打印(结果);

上述代码返回以下内容:
  • div
    • p
      • div
        • b

您注意到'div'现在是'p'的子级,即使他们是兄弟姐妹,'div'出现在'p'之后,与原始输入不同


它应该是这样的:
  • div
    • div
        b
    • p

这是一个未中断的函数,删除了引用调用,因为如果您不知道它们到底是什么,可能会出现模糊的错误(并且您可能知道如何/何时使用它们,下一个程序员可能会遇到困难,引用最好有一个非常明确的原因使用,或者根本不使用):

children();
if(空($children))返回“”;
$result='
    '; foreach($xml->children()作为$name=>$xmlchild){ $result.='
  • 。$name.xml2ul($xmlchild)。
  • ; } $result.='
'; 返回$result; } echo xml2ul(simplexml\u load\u字符串($xml),$result);
SimpleXML
不是
DOMDocument
(尽管两者都使用
libxml
),而且确实,函数的逻辑是错误的,不是xml库。@Wrikken:我从一个SO用户那里得到了这个函数。我对DOMDocument类知之甚少。再说一遍:没有使用任何一个
DOMDocument
类。而另一个用户给了你坏代码。
   <ul>
      <li>div
         <ul>
            <li>p
            <ul>
                <li>div
                       <ul>
                           <li>b</li>
                       </ul>
                 </li>
           </ul>
          </li>
      </ul>
   </li>
  </ul>
<ul>
    <li>div
    <ul>
     <li>div
       <ul>b</ul>
    </li>

    <li>p</li>

    </ul>
    </li>

</ul>
<?php
$xml = '
<div>
   <div>
       <b></b>
   </div>
   <p></p>
</div>
';


function xml2ul($xml) {
    $children = $xml->children();
    if(empty($children)) return '';
    $result = '<ul>';
    foreach($xml->children() as $name => $xmlchild) {
        $result .= '<li>'.$name.xml2ul($xmlchild).'</li>';
    }
    $result .= '</ul>';
    return $result;
}

echo xml2ul(simplexml_load_string($xml), $result);