作者truehero (wek)
看板Python
标题[问题] ElemetTree xml 读入修改写出後_属性无序
时间Thu Mar 26 15:30:58 2015
请教诸位大师
小弟 使用python 3.4 目前想要做xml 读入修改写出,使用最简单的ElementTree
发现输出後attribute 的排列并不是预期的 而是排序过的
输入xml 如下
<Config>
<TestList>
<Item Name="PlayOne" Enabled="TRUE" />
</TestmList>
</Config>
变成以下 属性输出颠倒了
<Config>
<TestList>
<Item Enabled="TRUE" Name="PlayOne" />
</TestmList>
</Config>
----------------------------------------------------
import xml.etree.ElementTree as ET
.....
tree = ET.ElementTree(file=location)# crash if file not xml
.....
for elem in tree.iter(tag=tag_name):
elem.text = search_text
tree.write(location)
return True
....
--------------------------------------------------------
经查询这个行为是正常的, 网路上有给了一些意见与workaround 如
http://bbs.csdn.net/topics/350179891
http://bbs.csdn.net/topics/390127707
http://stackoverflow.com/questions/2741480/can-elementtree-be-told-to-preserve-the-
order-of-attributes
可以利用hook XMLTreeBuilder 将attribute 储存换成用OrderedDict
但这个范例做法问题在
xml.etree.ElementTree.XMLTreeBuilder 已经在後来的版本中被移除了
试着用XMLParser +TreeBuilder
class MyTreeBuilder(ElementTree.TreeBuilder):
def start(self, tag, attrib):
print ("start !!")
print (tag,attrib)
attrib_od = OrderedDict()
for key , value in attrib.items ():
attrib_od[key] = value
print (key)
ElementTree.TreeBuilder.start(self,tag,attrib_od)
class CommentedTreeBuilder ( ElementTree.XMLParser ):
def __init__ ( self, html = 0, target = None ):
ElementTree.XMLParser.__init__( self, html, target )
tree = ET.parse( f, parser = CommentedTreeBuilder(target = MyTreeBuilder()) )
code可以跑 也确实将attribute 用OrderedDict 存入了
但是感觉没有效果
参考了一些其他文章
http://sysmagazine.com/posts/133097/
http://stackoverflow.com/questions/14228659/adding-new-xml-node-and-pretty-printing-xml-
in-python
写了hook 的做法 想将 ElementTree._write 覆写 将_write中的sort排除
ET.ElementTree._write=_write # 应该是这个 下面CODE是乱TRY 的
ET._write=_write
但是实际上CODE根本跑不到
我的问题有几个
1. 如果不用ElementTree 有甚麽其他方法可能达成需求 ?
2. ET.ElementTree._write=_write 这种直接覆写方式 是不是在新版python不被允许了
或者要变成直接继承ElementTree来覆写??
都不行可能要直接改python ElementTree.py 了
真的不想走到这一步阿~~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.44.227.53
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1427355063.A.7BC.html
1F:→ uranusjr: 为什麽需要有序?XML node attribute 属性本身就是无序 03/27 01:19
2F:→ truehero: 要比较前后档案差易作些特殊判断 03/27 11:39
3F:→ truehero: 最后修改ElementTree.py 解决 03/27 11:40