TreeCtrl + Panel + expat XML Parser
Verfasst: Donnerstag 2. September 2010, 09:36
Hallo zusammen,
ich möchte mit dem expat Parser ein XML parsen, dass dann einige Element in einem Baum, andere in einem Panel darstellt.
Das XML sieht Schemahaft so aus:
Es gibt Tests und es gibt Testgruppen mit mehreren Tests. Einzelne Tests sind auf der gleichen Ebene wie Testgruppen. Tests enthalten weitere Elemente, welche sich aber von der Anzahl unterscheiden. Also Test a hat beispielsweise 5 weitere Elemente mit Unterelementen, wobei Test c nur 3 Elemente ohne Unterelemente hat.
Ich Parse die Datei mit dem expat Parser und möchte das ganze gerne so machen, dass mir bis zu der Ebene der Testgruppentests ein Baum erstellt wird.
In diesem Fall also:
Baum:
Die weiteren Inhalte sollen dann neben dem Baum in einem Panel angezeigt werden. Also am Beispiel von Test a sollte bei einem Klick darauf im Panel dann folgendes erscheinen:
result Test a: OK
...
Den Parser mit den Start-/End-Element- & Character-Handler habe ich schon, welcher mir das komplette XML als Baum darstellt:
Leider weiß ich überhaupt nicht, wie ich da vorgehen soll. Oder gibt es vielleicht eine bessere Möglichkeit als den expat? Bin noch recht neu auf dem Gebiet.
Freu mich auf Antworten.
Grüße
Matthias
ich möchte mit dem expat Parser ein XML parsen, dass dann einige Element in einem Baum, andere in einem Panel darstellt.
Das XML sieht Schemahaft so aus:
Code: Alles auswählen
<ueberblick>
<test name="a">
<testresult name="result Test a">OK</testresult>
...weitere Elemente
</test>
<testGroup name="b">
<test name="c">
...weitere Elemente
</test>
<test name="d">
...weitere Elemente
</test>
</testGroup>
...
</ueberblick>
Ich Parse die Datei mit dem expat Parser und möchte das ganze gerne so machen, dass mir bis zu der Ebene der Testgruppentests ein Baum erstellt wird.
In diesem Fall also:
Baum:
Code: Alles auswählen
-Überblick
-a
-b
-c
-d
result Test a: OK
...
Den Parser mit den Start-/End-Element- & Character-Handler habe ich schon, welcher mir das komplette XML als Baum darstellt:
Code: Alles auswählen
"""
Build a GUI Tree (wxWindows) from an XML file using pyExpat
"""
import sys,string
from xml.parsers import pyexpat
from wxPython.wx import *
class MyFrame(wxFrame):
def __init__(self, parent, id, title):
wxFrame.__init__(self, parent, id, title, wxPoint(100, 100), wxSize(160,
100))
menu = wxMenu()
menu.Append (1001,"Open")
menu.Append (1002,"Close")
menu.Append (1003,"Exit")
menubar = wxMenuBar()
menubar.Append (menu,"File")
self.SetMenuBar(menubar)
class MyApp(wxApp):
def OnInit(self):
self.frame = MyFrame(NULL, -1, "Tree View of XML")
self.tree = wx.wxTreeCtrl (self.frame, -1)
EVT_MENU(self, 1001, self.OnOpen)
EVT_MENU(self, 1002, self.OnClose)
EVT_MENU(self, 1003, self.OnExit)
self.frame.Show(true)
self.SetTopWindow(self.frame)
return true
def OnOpen(self,event):
f = wxFileDialog(self.frame,"Select a file",".","","*.xml",wxOPEN)
if f.ShowModal() == wxID_OK:
LoadTree (f.GetPath())
def OnClose(self,event):
self.tree = wx.wxTreeCtrl (self.frame, -1)
pass
def OnExit(self,event):
self.OnCloseWindow(event)
def OnCloseWindow(self, event):
self.frame.Destroy()
NodeStack = []
# Define a handler for start element events
def StartElement( name, attrs ):
global NodeStack
NodeStack.append (app.tree.AppendItem (NodeStack[-1],name))
def EndElement( name ):
global NodeStack
NodeStack = NodeStack[:-1]
def CharacterData ( data ):
global NodeStack
if string.strip(data):
app.tree.AppendItem (NodeStack[-1],data)
def LoadTree (f):
print f
# Create a parser
Parser = pyexpat.ParserCreate()
# Tell the parser what the start element handler is
Parser.StartElementHandler = StartElement
Parser.EndElementHandler = EndElement
Parser.CharacterDataHandler = CharacterData
# Parse the XML File
ParserStatus = Parser.Parse( open(f,'r').read(), 1)
if ParserStatus == 0:
print "oops!"
raise SystemExit
app = MyApp(0)
NodeStack = [app.tree.AddRoot ("Root")]
app.MainLoop()
raise SystemExit
Leider weiß ich überhaupt nicht, wie ich da vorgehen soll. Oder gibt es vielleicht eine bessere Möglichkeit als den expat? Bin noch recht neu auf dem Gebiet.
Freu mich auf Antworten.
Grüße
Matthias