473,480 Members | 1,945 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

Advice for editing xml file using ElementTree and wxPython

I'm a computational chemist who frequently dabbles in Python. A
collaborator sent me a huge XML file that at one point was evidently
modified by a now defunct java application. A sample of this file
looks something like:

<group type="struct">
<name>Test</name>
<param type="string">
<name>File Name</name>
<cTag>fileName</cTag>
<desc>Name of the input file</desc>
<value>water</value>
</param>
<param type="int">
<name>Number of Atoms</name>
<cTag>natoms</cTag>
<desc>Number of atoms in the molecule</desc>
<value>3</value>
</param>
</group>

I've been playing around with parsing that file using the ElementTree
functions, and writing little functions to walk the tree and print
stuff out. I'd like to construct a little wxPython program to modify
the values graphically, maybe using something like a TreeCtrl widget.
I'm pretty sure I can figure out how to get the data into the widget.

- Struct
- File Name: water
- Number of Atoms: 3

etc.

What's confusing me is what I do when I shut down the gui and save the
data back to a file. What I would like to be able to do is to update
the values in the ElementTree itself, and use the .write(file)
function of the elementtree to write out the file, since that ends up
printing out something pretty much identical to the original xml file.
If I want to do this, it seems like I need to keep a connection
between the gui element and the original value in the elementtree, so
I can update it. But I'm having a hard time visualizing exactly how
this works. Can someone help me out here a bit?

If this is impossible, or too difficult, I can certainly figure out a
way to dump the XML directly from the gui itself, but I worry that
I'll mangle the XML in the process, which elementtree doesn't do (i.e.
the null operation, parsing a file with elementtree and writing it out
again doesn't change anything).

Seems like this is something that's probably pretty common, modifying
a data structure using a gui, so I'm hoping that someone has thought
about this and has some good advice about best practices here.

Thanks in advance for your time,

Rick
Dec 9 '07 #1
2 4242
On Dec 8, 8:35 pm, Rick Muller <rpmul...@gmail.comwrote:
I'm a computational chemist who frequently dabbles in Python. A
collaborator sent me a huge XML file that at one point was evidently
modified by a now defunct java application. A sample of this file
looks something like:

<group type="struct">
<name>Test</name>
<param type="string">
<name>File Name</name>
<cTag>fileName</cTag>
<desc>Name of the input file</desc>
<value>water</value>
</param>
<param type="int">
<name>Number of Atoms</name>
<cTag>natoms</cTag>
<desc>Number of atoms in the molecule</desc>
<value>3</value>
</param>
</group>
<snip>
>
Seems like this is something that's probably pretty common, modifying
a data structure using a gui, so I'm hoping that someone has thought
about this and has some good advice about best practices here.
The trick is to keep a reference to the actual ElementTree objects
as you build your TreeCtrl. Ability to store arbitrary Python object
in the TreeCtrl Item makes it easy. In an event handler modify the
original element and you are done. Do not forget to save when
closing.

If the XML file is very large you may have performance issues since
the whole parsed tree is kept in memory. Luckily the ElementTree
representation is lean.

A sample below shows the approach. It is very basic but I hope it
conveys the idea. Please note that edits to the actual tags are
ignored.

-------------------------------------------------------------------
import wx
import xml.etree.cElementTree as ET

class MainFrame(wx.Frame):
def __init__(self, fpath):
wx.Frame.__init__(self, None)
self.fpath = fpath
self.xml = ET.parse(fpath)
self.tree = wx.TreeCtrl(self,
style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS)
root = self.fillmeup()
self.tree.Expand(root)

self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnEdit)

def fillmeup(self):
xml = self.xml.getroot()
tree = self.tree
root = tree.AddRoot(xml.tag)
def add(parent, elem):
for e in elem:
item = tree.AppendItem(parent, e.tag, data=None)
text = e.text.strip()
if text:
val = tree.AppendItem(item, text)
tree.SetPyData(val, e)
add(item, e)
add(root, xml)
return root

def OnEdit(self, evt):
elm = self.tree.GetPyData(evt.Item)
if elm is not None:
elm.text = evt.Label

def OnClose(self, evt):
self.xml.write(self.fpath)
self.Destroy()
if __name__=='__main__':
app = wx.App(False)
frame = MainFrame('sample.xml')
frame.Show()
app.MainLoop()
Dec 9 '07 #2
On Dec 8, 11:57 pm, Waldemar Osuch <waldemar.os...@gmail.comwrote:
On Dec 8, 8:35 pm, Rick Muller <rpmul...@gmail.comwrote:
I'm a computational chemist who frequently dabbles in Python. A
collaborator sent me a huge XML file that at one point was evidently
modified by a now defunct java application. A sample of this file
looks something like:
<group type="struct">
<name>Test</name>
<param type="string">
<name>File Name</name>
<cTag>fileName</cTag>
<desc>Name of the input file</desc>
<value>water</value>
</param>
<param type="int">
<name>Number of Atoms</name>
<cTag>natoms</cTag>
<desc>Number of atoms in the molecule</desc>
<value>3</value>
</param>
</group>

<snip>
Seems like this is something that's probably pretty common, modifying
a data structure using a gui, so I'm hoping that someone has thought
about this and has some good advice about best practices here.

The trick is to keep a reference to the actual ElementTree objects
as you build your TreeCtrl. Ability to store arbitrary Python object
in the TreeCtrl Item makes it easy. In an event handler modify the
original element and you are done. Do not forget to save when
closing.

If the XML file is very large you may have performance issues since
the whole parsed tree is kept in memory. Luckily the ElementTree
representation is lean.

A sample below shows the approach. It is very basic but I hope it
conveys the idea. Please note that edits to the actual tags are
ignored.

-------------------------------------------------------------------
import wx
import xml.etree.cElementTree as ET

class MainFrame(wx.Frame):
def __init__(self, fpath):
wx.Frame.__init__(self, None)
self.fpath = fpath
self.xml = ET.parse(fpath)
self.tree = wx.TreeCtrl(self,
style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS)
root = self.fillmeup()
self.tree.Expand(root)

self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnEdit)

def fillmeup(self):
xml = self.xml.getroot()
tree = self.tree
root = tree.AddRoot(xml.tag)
def add(parent, elem):
for e in elem:
item = tree.AppendItem(parent, e.tag, data=None)
text = e.text.strip()
if text:
val = tree.AppendItem(item, text)
tree.SetPyData(val, e)
add(item, e)
add(root, xml)
return root

def OnEdit(self, evt):
elm = self.tree.GetPyData(evt.Item)
if elm is not None:
elm.text = evt.Label

def OnClose(self, evt):
self.xml.write(self.fpath)
self.Destroy()

if __name__=='__main__':
app = wx.App(False)
frame = MainFrame('sample.xml')
frame.Show()
app.MainLoop()
This was exactly what I was looking for! Thanks very much.

Rick
Dec 9 '07 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
3239
by: Stewart Midwinter | last post by:
I want to parse a file with ElementTree. My file has the following format: <!-- file population.xml --> <?xml version='1.0' encoding='utf-8'?> <population> <person><name="joe" sex="male"...
14
7460
by: Erik Bethke | last post by:
Hello All, I am getting an error of not well-formed at the beginning of the Korean text in the second example. I am doing something wrong with how I am encoding my Korean? Do I need more of a...
3
2389
by: dlesandrini | last post by:
I need advice about my decision to go with Replication in general. This post was placed on the Microsoft Replication newsgroup, but I really value the feedback that comes from this group as well. ...
2
3442
by: Randall Parker | last post by:
Running Python 2.4.2 on Windows in SPE. I have a very small XML file (see below) that is in UTF-8 and saved by Windows Notepad as such. I'm reading it with minidom. My problem is that once I...
2
1951
by: mirandacascade | last post by:
Situation is this: 1) I have inherited some python code that accepts a string object, the contents of which is an XML document, and produces a data structure that represents some of the content of...
8
2047
by: D | last post by:
Hi, I currently have a Python app with a Tkinter GUI frontend that I use for system administration. Everytime it launches, it reads a text file which contains info about each host I wish to...
4
1383
by: Chelonian | last post by:
I'm considering trying to learn Python for a specific reason, and hoped the group might help me get a sense for whether it would be worth my time. The situation... Me: total beginner w/ a...
0
903
by: limodou | last post by:
I don't know if it's a bug? Try below code: ... print 'hhhh' ... 0 You can see if I test a, the result will be False. I don't know if it's an expected result, but this thing has beaten...
11
3489
by: Peter Pei | last post by:
One bad design about elementtree is that it has different ways parsing a string and a file, even worse they return different objects: 1) When you parse a file, you can simply call parse, which...
0
7033
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
6903
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
6861
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
5318
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
1
4763
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
4468
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
2987
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
1291
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
0
170
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.