ElementTree元素的一致性

时间:2018-08-24 10:01:24

标签: python elementtree

我正在使用xml来描述边界框,并打算过滤掉xml文件的某些元素。典型的xml可能看起来像:

<annotation>
    <folder>original2</folder>
    <filename>beach146.jpg</filename>
    <path>/home/train/original/beach146.jpg</path>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>800</width>
        <height>533</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>person</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>314</xmin>
            <ymin>315</ymin>
            <xmax>559</xmax>
            <ymax>400</ymax>
        </bndbox>
    </object>
    <object>
        <name>boat</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>580</xmin>
            <ymin>193</ymin>
            <xmax>602</xmax>
            <ymax>205</ymax>
        </bndbox>
    </object>
</annotation>

我正在对bbox坐标进行一些检查,如有必要,请删除包含相应bbox的object

我正在使用类似以下内容的坐标:

xmin = int(obj.find('bndbox').find('xmax').text)

但是看起来很尴尬和丑陋,所以我切换到:

xmin = int(obj[4][0].text)

这似乎好一点。 obj来自objs = tree.findall('object'),因此甚至可以通过对根应用相同的索引来对其进行优化,例如:

print(root[7][4][0].tag, root[7][4][0].text)
  

xmin 580

我的问题是索引系统是否一致,并且将在每个xml文件中按预期工作。这意味着它将以文件中写入元素的顺序返回元素。我的xml文件应具有相同的元素顺序。在其他情况下,应该对obj[4][0].tag进行检查,以确认我正在处理预期的元素。

1 个答案:

答案 0 :(得分:1)

我认为索引系统是一致的。但是按索引访问元素可能会造成混淆,并且容易出错。

我的建议是使用findtext()

from xml.etree import ElementTree as ET

tree = ET.parse("annotation.xml")

for obj in tree.findall("object"):
    xmin = obj.findtext('bndbox/xmin')
    ...