[問題] ElemetTree xml 讀入修改寫出後_屬性無序

看板Python作者 (wek)時間10年前 (2015/03/26 15:31), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串1/1
請教諸位大師 小弟 使用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
為什麼需要有序?XML node attribute 屬性本身就是無序
03/27 01:19, 1F

03/27 11:39, , 2F
要比較前后檔案差易作些特殊判斷
03/27 11:39, 2F

03/27 11:40, , 3F
最后修改ElementTree.py 解決
03/27 11:40, 3F
文章代碼(AID): #1L4xMtUy (Python)
文章代碼(AID): #1L4xMtUy (Python)