Das Document Object Model DOM

Das Perl-Skript unten benutzt das Paket XML::DOM, um automatisch einen Graphen der DOM-Darstellung eines XML-Dokuments zu erzeugen. Die eigentlichen DOM-Aufrufe und die Logik, die die rekursive Durchquerung des Dokuments steuert, sind in dem Listig hervorgehoben. Der Rest dient im wesentlichen dazu, die Informationen in einem Format auszugeben, das das sehr schöne Graphen-Layoutprogramm [Ext. Link]Graphviz von AT&T versteht (das übrigens eine der seltsamsten (wahscheinlich) Open-Source-Lizenzen besitzt, die mir bisher begegnet sind).

1#!/usr/bin/perl -w
2use XML::DOM;
3use HTML::Entities;
4
5my $p = new XML::DOM::Parser;
6my $d = $p->parse(join "", <>);
7my $de = $d->getDocumentElement() or die "Dokument ist leer";
8
9print "digraph DOM {
10node [fontname=\"Helvetica\"];
11ranksep=\".75in\"\n";
12
13makegraph($de, "a", "");
14
15print "}\n";
16
17sub makegraph {
18    my ($elem,$lab,$parlab) = @_;
19    if ($elem->getNodeType == ELEMENT_NODE) {
20        my $label = "{" . $elem->getTagName();
21        my $attrs = $elem->getAttributes();
22        if (my $num = $attrs->getLength()) {
23            $label .= "|";
24            for (my $i = 0; $i < $num; ++$i) {
25                $label .= $attrs->item($i)->getName() . "="
26                    . $attrs->item($i)->getValue() ."\\n";
27            }
28        }
29        $label .= "}";
30        print "$lab [shape=record,label=\"", $label , "\"];\n";
31    } elsif ($elem->getNodeType == TEXT_NODE) {
32        print "$lab [label=\"",
33              encode_entities($elem->toString(), "\0-\37<\"'"),
34                     "\"];\n";
35    } else {
36        return;
37    }
38    print $parlab, " -> ", $lab, ";\n" if $parlab;
39    my $llab = "a";
40    my $iter = $elem->getFirstChild or return;
41    do {
42        makegraph($iter, $lab . "Z" . $llab, $lab);
43        ++$llab;
44    } while $iter = $iter->getNextSibling;
45}
Zurück zur Übersicht über die XML APIs
Florian Hars <florian@hars.de>, 2007-10-15 (orig: 2000-06-14)