Python 如何(手动)编辑元素树的xml格式
假设我有两个XML文件,如下所示: version1.xml: 但我并不是在寻找这个(我的需求涉及一个部分格式化的XML,它不能完美地与上述函数一起工作) 如果我检查每个元素的文本差异,我只得到以下结果:Python 如何(手动)编辑元素树的xml格式,python,elementtree,Python,Elementtree,假设我有两个XML文件,如下所示: version1.xml: 但我并不是在寻找这个(我的需求涉及一个部分格式化的XML,它不能完美地与上述函数一起工作) 如果我检查每个元素的文本差异,我只得到以下结果: import xml.etree.ElementTree as ET xml_path1 = 'path/to/version1.xml' xml_path2 = 'path/to/version2.xml' tree1 = ET.parse(xml_path1) annot1 = tree
import xml.etree.ElementTree as ET
xml_path1 = 'path/to/version1.xml'
xml_path2 = 'path/to/version2.xml'
tree1 = ET.parse(xml_path1)
annot1 = tree1.getroot()
tree2 = ET.parse(xml_path2)
annot2 = tree2.getroot()
for elem1, elem2 in zip(annot1.iter(), annot2.iter()):
if repr(elem1.text) != repr(elem2.text):
print(elem1, repr(elem1.text), elem2, repr(elem2.text))
输出:
<Element 'object' at 0x7fb26fc2d9f8> '\n\t' <Element 'object' at 0x7fb1c4e4da48> None
<Element 'bndbox' at 0x7fb1c4e4d8b8> '\n\t\t' <Element 'bndbox' at 0x7fb1c4e4dbd8> None
输出:
<object>
<name>boat</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox>
<xmin>0</xmin><ymin>434</ymin><xmax>152</xmax><ymax>504</ymax></bndbox></object>
<object>
<name>boat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>0</xmin>
<ymin>434</ymin>
<xmax>152</xmax>
<ymax>504</ymax>
</bndbox>
</object>
输出:
<object>
<name>boat</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox>
<xmin>0</xmin><ymin>434</ymin><xmax>152</xmax><ymax>504</ymax></bndbox></object>
<object>
<name>boat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>0</xmin>
<ymin>434</ymin>
<xmax>152</xmax>
<ymax>504</ymax>
</bndbox>
</object>
船
未指明
0
0
0
434
152
504
那么,格式化是怎么回事?我知道它实际上并没有影响XML的内容(机器认为内容和我想的一样),但是元素树保存了这些信息。p>
- 是否有任何(困难且可能没有效率的)方法来控制 XML的格式
- 为什么一些包含实际值的元素(如
)在我的例子中只显示这个值并隐藏格式文本,而另一些元素(如xmin
)实际封装了其他子元素,却显示这些格式字符串bndbox
- 缺少的空白在
元素中。tail
()
生成输出时,ElementTree打印开始元素、内容、结束元素,然后打印尾部
下面是一个设置子树格式的技巧(并且不涉及文档的其余部分):
“\n”
替换为“\n”+(“*level)
,其中level
是子树的深度或者,您可以创建一个新文档,方法是将子树包装在
level
wrapper元素中,漂亮地打印整个文档,然后再次找到子树。谢谢,.tail
部分就是我要找的。我硬编码了实际的“尾巴”,它工作得很好。
<object>
<name>boat</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox>
<xmin>0</xmin><ymin>434</ymin><xmax>152</xmax><ymax>504</ymax></bndbox></object>
ET.dump(annot1)
<object>
<name>boat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>0</xmin>
<ymin>434</ymin>
<xmax>152</xmax>
<ymax>504</ymax>
</bndbox>
</object>