2017-09-02 71 views
2

我有一個內存蟒XML ElementTree的看起來像如何以xml節點的有序方式序列化python ElementTree?

<A> 
    <B>..</B> 
    <C>..</C> 
    <D>..</D> 
</A> 

我序列ElementTree的成XML通過

xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(" ") 

內節點B的順序,C,d的每一次變化我調用上面的tostring()方法。我怎樣才能確保我的序列化將遵循確定性的順序?

+3

無法重現。請提供[mcve]。 –

回答

0

我知道很多答案在這裏建議這一點,但

minidom.parseString(ET.tostring(root)).toprettyxml(" ") 

實際上是非常印刷XML文件真正可怕的方式。

它涉及到解析,與ET序列化,然後再解析,並用完全不同的XML庫再次序列化。這很愚蠢和浪費,如果迷你遊戲機弄亂了它,我不會感到驚訝。

如果你安裝了它,切換到lxml and use its built-in pretty-printing function

如果您由於某種原因套牢xml.etree.ElementTree,你可以用一個簡單的遞歸函數來美化樹就地:

# xmlhelpers.py 

# taken from http://effbot.org/zone/element-lib.htm#prettyprint 
def indent(elem, level=0): 
    i = "\n" + level*" " 
    if len(elem): 
     if not elem.text or not elem.text.strip(): 
      elem.text = i + " " 
     if not elem.tail or not elem.tail.strip(): 
      elem.tail = i 
     for elem in elem: 
      indent(elem, level+1) 
     if not elem.tail or not elem.tail.strip(): 
      elem.tail = i 
    else: 
     if level and (not elem.tail or not elem.tail.strip()): 
      elem.tail = i 

用法是直截了當:

import xml.etree.ElementTree as ET 
from xmlhelpers import indent  

root = ET.fromstring("<A><B>..</B><C>..</C><D>..</D></A>") 
indent(root) 

print(ET.tostring(root)) 

此打印很好地縮進版本:

b'<A>\n <B>..</B>\n <C>..</C>\n <D>..</D>\n</A>\n' 

話雖這麼說,從未使用「的toString」寫XML樹到一個文件中。

始終使用XML庫提供的函數編寫XML文件。

tree = ET.ElementTree(root) # only necessary if you don't already have a tree 
tree.write(filename, encoding="UTF-8") 
相關問題