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