2010-12-09 14 views
3

Ich habe einige XML-Dokumente, die, grob vereinfacht, kann wie folgt beschrieben werden:Wie visualisiert man eine Menge miteinander verbundener XML-Objekte?

<someobject id="mykey"> 
    <relatedobject id="hiskey"/> 
    <relatedobject id="herkey"/> 
</someobject> 
<someobject ... 

Was wäre eine einfache Möglichkeit, ein Diagramm, dies zu erzeugen, die Objekte gut in 2D-Raum platziert zeigt, mit Linien zwischen ihnen ?

Ich bin sehr zufrieden mit XSLT und Xpath, würde aber eine Lösung bevorzugen, die kein Programm von Grund auf neu schreiben muss. Mit ein paar Befehlszeilenaufrufen an Saxon wäre ein Graph, der prog erzeugt, in Ordnung. Bonuspunkte für alles, was mithilfe von online gehosteten Tools vollständig erledigt werden kann. Extra Bonuspunkte für ein Live (zB Javascript), interaktives Diagramm.

+0

Ich denke, Sie haben vergessen, die Beschreibung, die Sie versprochen haben, einzuschließen ... es sei denn, Sie möchten, dass wir Ihnen erklären, wie Sie ein Diagramm mit Leerzeichen erstellen können? – gutch

+0

Sie müssen Code 4 Leerzeichen einrücken (oder verwenden Sie die 101010-Schaltfläche im Editor), insbesondere XML. Ich habe es für dich repariert. –

+0

hoppla, danke. –

Antwort

3

Hier ist eine schnelle Lösung, die direkt an eine Shell eingefügt werden können, können unter Verwendung von GraphViz als suggested by Philipp. Dies macht Gebrauch von xmlstarlet, um zu vermeiden, ein XSLT-Stylesheet von Grund auf neu schreiben zu müssen.

(echo "graph G {" 
    xmlstarlet sel -t -m "//someobject/relatedobject" \ 
    -v "concat(../@id, ' -- ', @id, '&#xa;')" input.xml 
    echo "}") | dotty - 

Beispielausgabe:

alt text


Edited hinzufügen: Und für die zusätzlichen Bonuspunkte, eine interaktive SVG Diagramm nur Online-Tools here verwenden. Dies macht Gebrauch von Dracula Graph Library und W3C XSLT Service. Dies erforderte die Erstellung eines XSLT stylesheet (direkt aus den Online-Beispielen für Dracula Graph Library). Das für die Transformation verwendete Eingabedokument finden Sie unter here.

+0

wow, sehr clever - ich wünschte, ich könnte dir wirklich Bonuspunkte geben :) Ich bin ziemlich nah dran, diese Lösung für mein eigenes Problem zu implementieren. nicht sicher, warum es nicht funktioniert: es läuft lokal gut. view-source: http://www.w3.org/2005/08/online_xslt/xslt?xslfile= http://pastebin.com/download.php%3Fi%3DY0JYrmaT&xmlfile=http: //pastebin.com/ Raw.php% 3Fi% 3DakxLeD4e & transform = Einreichen –

+0

@Steve, habe dein Beispiel mit den folgenden Änderungen arbeiten: (1) mit dem "Download" Link zu Pastebin und nicht mit dem "Raw" Link, und (2) die XHTML Namespace URI zu beheben . http://www.w3.org/2005/08/online_xslt/xslt?xslfile=http://pastebin.com/download.php%3Fi%3DpC3Je8zh&xmlfile=http://pastebin.com/download.php%3Fi% 3DakxLeD4e & content-type = & submit = transformiere –

+0

Matailainen, omg, danke sehr. Ich bin wirklich demütig. –

2

Ich würde vorschlagen, GraphViz zu verwenden: Sie erstellen eine Textdatei mit XSLT, die das Diagramm beschreibt, das Sie möchten. Einen schnellen Überblick finden Sie unter this example.

Ich bin nicht allzu vertraut mit ihm mehr, aber ich denke,

graph G { 
    mykey -- hiskey 
    mykey -- herkey 
} 

die Arbeit machen sollte.

+0

Danke, ich habe das zu arbeiten, obwohl bis jetzt die Ergebnisse ziemlich schrecklich sind - aus irgendeinem Grund komprimiert neato alle Objekte zu nahe zusammen, was zu einem massiven unlesbaren Klecks von überlappendem Text und Pfeilen führt. –

+0

versuchen Sie es mit Punkt anstelle von neato, für mich ist der Layout-Algorithmus in der Regel erfolgreicher. Lassen Sie sich nicht davon abhalten, dass es für gerichtete Graphen ist - Sie können ihm sagen, dass er keine Pfeile auf die Linien setzen soll. z.B. 'Digraph G { main -> init [Pfeilspitze =" keine "]; } ' – sfinnie

+0

Punkt ist noch schlimmer, weil es eine Hierarchie macht, und meine Daten sind überhaupt nicht so. fdp macht das Beste bisher, obwohl es immer noch ziemlich schwer zu kontrollieren ist. –

0

Dies ist kein einfaches Problem. Ich habe vor langer Zeit ein Programm geschrieben, um XML-Dokumente zu clustern, aber die Anzeige ist ein Raster anstelle eines Graphen. Dennoch könnte es sein, dass Sie sich für den Code interessieren, wenn Sie etwas implementieren möchten. Darüber hinaus können Sie Ihren Dokumenten Schlüsselwörter zuordnen, und die Schlüsselwörter sowie die Links zum Clustern der Dokumente sowie die Namen der resultierenden Cluster verwenden. Die Rasteranzeige ist wahrscheinlich besser als eine Grafik, wenn viele Dokumente vorhanden sind.

http://media4.obspm.fr/outils/clustering/doc_en.html

Verwandte Themen