创建新子元素时形成Python XML层次结构

时间:2017-02-26 22:51:55

标签: xml python-3.x format editing

我遇到的问题是,在创建子元素后更新XML文件时,文件不会使用层次结构格式更新,并且不会保留<?xml version="1.0"?>

这是我的代码:

import xml.etree.ElementTree as ET
import time
tree = ET.parse('TEST.xml')
root = tree.getroot()

x=root
newuser=ET.SubElement(x,("USER name='admin2' "))
tree.write("TEST.xml")

在我运行代码之前,这是我的XML文件:

<?xml version="1.0"?>
<root>
</root>

这是运行代码后的XML文件:

<root>
<USER name='admin2'  /></root>

1 个答案:

答案 0 :(得分:0)

XML中的漂亮打印是一种黑暗的艺术......你怎么知道给定的文本节点是文档的一部分还是只是用于装饰?在做出这些决定时,LXML往往是保守的。如果文档有文本节点,即使只有“\ n”的文本节点,它可能不会打印文档。但是你可以在加载后自己剥离节点:

>>> import lxml.etree as etree
>>> root = etree.fromstring("""<?xml version="1.0"?>\n<root>\n</root>""")
>>> root.text
'\n'
>>> for elem in root.iter("*"):
...     if elem.text:
...         elem.text = elem.text.strip() or None
... 
>>>

现在您可以添加数据

>>> etree.SubElement(root, "USER", name="admin2")
<Element USER at 0x7fd60d37efc8>

然后,当您序列化文档时,您可以添加一个xml声明并选择相当打印输出。

>>> serialized=etree.tostring(root, xml_declaration=True, pretty_print=True)
>>> print(serialized.decode("ascii"))
<?xml version='1.0' encoding='ASCII'?>
<root>
  <USER name="admin2"/>
</root>