PHP DOMDocument: HTML для дерева узлов - PullRequest
0 голосов
/ 03 апреля 2011

Эта функция преобразует HTML в дерево узлов (<ul> структура). Тем не менее, каждый узел возвращается как дочерний узел предыдущего узла , даже , если этот узел был родственным узлом текущего узла.

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


приведенный выше код возвращает это:

   <ul>
      <li>div
         <ul>
            <li>p
            <ul>
                <li>div
                       <ul>
                           <li>b</li>
                       </ul>
                 </li>
           </ul>
          </li>
      </ul>
   </li>
  </ul>


вы заметили, что div теперь является потомком p, даже если они являются братьями и сестрами, а div имеет после 'p' в отличие от исходного ввода.


вот так это должно выглядеть:

<ul>
    <li>div
    <ul>
     <li>div
       <ul>b</ul>
    </li>

    <li>p</li>

    </ul>
    </li>

</ul>

1 Ответ

1 голос
/ 03 апреля 2011

Итак, функция без прерываний, с удаленным вызовом по ссылке, потому что, если вы точно не знаете, что это такое, возможны скрытые ошибки (и вы можете знать, как и когда их использовать, следующийкодер может бороться, ссылки лучше всего использовать с очень ясной причиной или нет вообще):

<?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);
...