Python 如何(手动)编辑元素树的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

假设我有两个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 = 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
      是子树的深度
    • 使用ETree将字符串解析为文档,并用新文档的根元素替换子树

    • 或者,您可以创建一个新文档,方法是将子树包装在
      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>