2017-09-02 1 views
2

私はPython ElementTreeをxmlノードの順序付けられた方法でシリアル化する方法は?

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

によってXMLに内部ノードBの順序をElementTreeのをシリアル

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

のようになり、メモリ内のPython XMLのElementTreeを有する、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' 

これは、ではありません。 XMLツリーをファイルに書き込むために "tostring"を使用します。

XMLライブラリで提供されている関数を使用して、常にXMLファイルを記述します。

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