HTML/XML Tree darstellen
Dirk
- php
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
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
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
PS: Nicht valide, sondern wohlgeformt...
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
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;
}
}
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 .= ' '; //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. :(
}
}