Dirk: HTML/XML Tree darstellen

Hi,

gerne würde ich sowas wie eine Baumansicht für HTML Dokumente und XMLs realisieren, wobei ich für den DHTML/JS Part schon eine Lösung habe, aber beim Parser, den ich gerne mit PHP schreiben würde, hängts noch.
Daher wüsste ich gerne, ob es nicht schon einen Parser gibt, der beispielsweise soetwas liefert:
HTML
 HEAD
 /HEAD
 BODY
  DIV
   INPUT/
   TEXTAREA
   /TEXTAREA
  /DIV
 /BODY
/HTML

Thx

  1. Hallo,

    gerne würde ich sowas wie eine Baumansicht für HTML Dokumente

    welchen Einfluß hast Du auf die Validität der HTML-Dokumente?

    Freundliche Grüße

    Vinzenz

    1. Hi,

      das Dokument ist valide.
      $dom = new domDocument; funktioniert auch bestens;
      aber wie bekomm ich da dann die gewünschte Ausgabe hin?

      print_r($dom); will nicht bei den Klassen...

      Cu

      1. PS: Nicht valide, sondern wohlgeformt...

      2. Hi,

        $dom = new domDocument; funktioniert auch bestens;
        aber wie bekomm ich da dann die gewünschte Ausgabe hin?

        Durchlaufe die Kindelemente rekursiv, beim Wurzelknoten beginnend.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. function PrintDomTree($DomNode)
          {
              if ($ChildDomNode = $DomNode->first_child()) {
                  static $depth = 0;

          $whitespace = "\n<br>".str_repeat(" ", ($depth * 2));

          while ($ChildDomNode) {
                      if ($ChildDomNode->node_type() == XML_TEXT_NODE) {
                          echo trim($ChildDomNode->node_value());
                      } elseif ($ChildDomNode->node_type() == XML_ELEMENT_NODE) {
                          $HasTag = 1;
                          echo $whitespace;
                          echo "<", $ChildDomNode->node_name();

          if ($ChildDomNode->has_attributes()) {
                              $Array = $ChildDomNode->attributes();
                              foreach ($Array AS $DomAttribute) {
                                  echo " ", $DomAttribute->name(), "="", $DomAttribute->value(), """;
                              }
                          }
                          echo ">";

          if ($ChildDomNode->has_child_nodes()) {
                              $depth++;
                              if (PrintDomTree($ChildDomNode)) {
                                  echo $whitespace;
                              }
                              $depth--;
                          }
                          echo "</", $ChildDomNode->node_name(), ">";
                      }
                      $ChildDomNode = $ChildDomNode->next_sibling();
                  }
                  return $HasTag;
              }
          }

          1. Oder besser noch: Diesen Schnipsel gabs im Internet zu finden und der funktioniert bestens:

            function walkDom($node, $level = 0)  
            {  
            $indent = '';  
            for ($i = 0; $i < $level; $i++)  
            $indent .= '&nbsp;&nbsp;'; //prettifying the output  
            if($node->nodeType != XML_TEXT_NODE)  
            {  
            echo $indent.'<b>'.$node->nodeName.'</b>';  
            if( $node->nodeType == XML_ELEMENT_NODE )  
            {  
            $attributes = $node->attributes; // get all the attributes(eg: id, class …)  
            foreach($attributes as $attribute)  
            {  
            echo ', '.$attribute->name.'='.$attribute->value;  
            // $attribute->name is usually one of these:  
            // src, type, rel, link, name, value, href, onclick,  
            // id, class, style, title  
            // You can add your custom handlers depending on the Attribute.  
            }  
            //if( strlen(trim($node->childNodes->item(0)->nodeValue)) > 0 && count($cNodes) == 1 )  
            //echo '<br>'.$indent.'(contains='.$node->childNodes->item(0)->nodeValue.')'; // do this to print the contents of a node, which maybe the link text, contents of div and so on.  
            }  
            echo '<br><br>';  
            }  
            $cNodes = $node->childNodes;  
            if (count($cNodes) > 0)  
            {  
            $level++ ; // go one level deeper  
            foreach($cNodes as $cNode)  
            walkDom($cNode, $level); //so this is recursion my professor kept talkin' about  
            $level = $level - 1; // come a level up, and had to do it this way or else wordpress would take away one dash. :(  
            }  
            }