PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XML als Baum


Senior Sanchez
2009-05-02, 16:55:48
Hi,

Ich habe hier eine Baumstruktur (ist keine binäre) in einer XML-ähnlichen Struktur gegeben. (da hängt keine DTD oder sonst etwas dran, das sind nur die Daten ohne Meta-Informationen)
Nun würde ich das ganze gerne visualisieren. Dabei möchte ich nicht diese klassische "hierarchische Windows Explorer Baum"-Ansicht (http://www.w3c.de/PubPraes/PNGS/IE-XML.png) haben, sondern das wie so einen richtigen Baum (http://www.w3c.de/PubPraes/PNGS/XML-Tut-neros.png), wie man ihn aus der Informatik kennt, darstellen: ganz oben die Wurzel und dadrunter gliedert sich das dann entsprechend in die Kindknoten auf.

Natürlich könnte ich mir so etwas selber schreiben, aber das ist mir den Aufwand nicht wehrt. Gibt es irgendein Tool das mir so eine Ansicht erzeugen kann?

Trap
2009-05-02, 16:57:04
Da gibt es schon ein fertiges Tool für:
http://www.graphviz.org/

Senior Sanchez
2009-05-02, 17:08:42
Danke für den Tipp!

Aber so richtig komme ich damit nicht weiter, da ich keine Ahnung habe wie ich eine XML-Datei laden kann :(

Gnafoo
2009-05-02, 17:28:47
Ich glaube direkt geht das nicht. Du müsstest wohl die XML-Datei einlesen und daraus eine DOT-Datei erstellen. Mit einem passablen XML-Parser dürfte das relativ schnell zu machen sein. Das erstellen des Graphen aus der relativ einfachen DOT-Datei kann dann Graphviz übernehmen. Ist eher der Mittelweg zwischen selbst machen und fertiger Lösung.

Senior Sanchez
2009-05-02, 17:34:39
Achso, hmm, ist mir zu aufwändig. *g*

Das soll nur so ein Anhängsel für die Uni zur besseren Darstellung eines Baumes sein, aber mehr Aufwand als ein paar Klicks wollte ich da nicht treiben. *g*

Gnafoo
2009-05-02, 17:58:17
Ach so wild ist das gar nicht und es hat den Vorteil, sehr anpassbar zu sein. Ich kann dir einen hässlichen Codeschnipsel in C# anbieten:


using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;

namespace TestXML
{
class Program
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("Test.xml");

using (Stream output = File.Create("Test.dot"))
{
using (TextWriter writer = new StreamWriter(output))
{
writer.WriteLine("digraph G {");
foreach (XmlNode child in doc.ChildNodes)
{
WriteNode(writer, child);
}
writer.WriteLine("}");
}
}
}

static void WriteNode(TextWriter writer, XmlNode node)
{
if (node.NodeType != XmlNodeType.Element &&
node.NodeType != XmlNodeType.Text) return;

if (node.NodeType == XmlNodeType.Text)
{
writer.WriteLine(" " + node.GetHashCode() + " [shape=box, label=\"" + node.Value + "\"];");
}
else
{
writer.WriteLine(" " + node.GetHashCode() + " [label=\"" + node.Name + "\"];");
}

if (node.ParentNode != null && node.ParentNode.NodeType == XmlNodeType.Element)
{
writer.WriteLine(" " + node.ParentNode.GetHashCode() + " -> " + node.GetHashCode() + ";");
}

foreach (XmlNode child in node.ChildNodes)
{
WriteNode(writer, child);
}
}
}
}


XML:

<?xml version="1.0" encoding="utf-8" ?>

<Test>
<Hello>bla</Hello>
<Bar>
<Foo>blubb</Foo>
<Gnar>abc</Gnar>
</Bar>
</Test>


http://www.abload.de/img/testwlox.png (http://www.abload.de/image.php?img=testwlox.png)

Gast
2009-05-06, 15:24:57
Die Altova Toolsuite kann das sicher.

Senior Sanchez
2009-05-06, 20:42:19
Hat sich mittlerweile erledigt, hab auch so volle Punktzahl auf die Aufgabe bekommen. *g*

Vielen Dank für die Tipps.