Согласованность элементов 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 и при необходимости удаляю 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 ответ
Я думаю, что система индексации является последовательной. Но доступ к элементам по индексу может сбить с толку и легко ошибиться.
Мое предложение заключается в использовании findtext()
,
from xml.etree import ElementTree as ET
tree = ET.parse("annotation.xml")
for obj in tree.findall("object"):
xmin = obj.findtext('bndbox/xmin')
...