[問題] ElemetTree xml 讀入修改寫出後_屬性無序
請教諸位大師
小弟 使用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://www.ptt.cc/bbs/Python/M.1427355063.A.7BC.html
→
03/27 01:19, , 1F
03/27 01:19, 1F
→
03/27 11:39, , 2F
03/27 11:39, 2F
→
03/27 11:40, , 3F
03/27 11:40, 3F
Python 近期熱門文章
PTT數位生活區 即時熱門文章