Согласованность элементов ElementTree - PullRequest
0 голосов
/ 24 августа 2018

Я использую 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 и при необходимости удаляю object, содержащий соответствующий bbox.

Я получал доступ к координатам, используя что-то вроде:

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 голосов
/ 25 августа 2018

Я думаю, что система индексации является последовательной. Но доступ к элементам по индексу может сбивать с толку и легко ошибиться.

Я предлагаю использовать findtext().

from xml.etree import ElementTree as ET

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

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