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
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 |
2 | use XML::DOM; |
3 | use HTML::Entities; |
4 |
|
5 | my $p = new XML::DOM::Parser; |
6 | my $d = $p->parse(join "", <>); |
7 | my $de = $d->getDocumentElement() or die "Dokument ist leer"; |
8 |
|
9 | print "digraph DOM { |
10 | node [fontname=\"Helvetica\"]; |
11 | ranksep=\".75in\"\n"; |
12 |
|
13 | makegraph($de, "a", ""); |
14 |
|
15 | print "}\n"; |
16 |
|
17 | sub 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 | } |