重命名 lxml 中的对象

Rename object in lxml

假设我们有一个这样的 xml 文件:

<annotation verified="yes">
  <folder>Annotation</folder>
  <filename>test_file</filename>
  <path>voc/JPEGImages/test_file</path>
  <source>
    <database>Unknown</database>
  </source>
  <size>
    <width>640</width>
    <height>480</height>
    <depth>3</depth>
  </size>
  <segmented>0</segmented>
  <object>
    <name>old_name</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>15</xmin>
      <ymin>164</ymin>
      <xmax>206</xmax>
      <ymax>344</ymax>
    </bndbox>
  </object>
</annotation>

现在我想更改给定 xml 文件中所有对象的名称。

我写了下面的函数:

def _rename_objects(tree, path, new_name="new_name"):
    root = tree.getroot()
    for rank in root.iter('object'):
        rank.text = str(new_name)
    tree.write(path)

它的作用是将文本放置到对象中。如何替换 'name' 中的值?不幸的是,树元素并不能真正打印出来进行调试。

<Element 'object' at 0x11235d400>

_rename_objects 之后的新值如下所示:

  <segmented>0</segmented>
  <object>new_name<name>old_name</name>
    <pose>Unspecified</pose>

您需要使用 [0] 索引来获取节点内容而不是节点本身。

rank <Element object>
rank[0] <Element name>

for rank in root.iter("object"):
    rank[0].text = str(new_name)

输出:

<name>new_name</name>