Не удается получить значение элемента XML-файла с Python - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю над программой, которая должна анализировать некоторые значения.Xml приведен ниже:

<?xml version="1.0" encoding="UTF-8"?>
<annotation>
   <folder>leaf_Haritaki</folder>
   <filename>Haritaki_010001.png</filename>
   <segmented>0</segmented>
   <size>
      <width>1456</width>
      <height>2592</height>
      <depth>3</depth>
   </size>
   <object>
      <name>Haritaki</name>
      <pose>Unspecified</pose>
      <truncated>0</truncated>
      <difficult>0</difficult>
      <bndbox>
         <xmin>316</xmin>
         <ymin>301</ymin>
         <xmax>1179</xmax>
         <ymax>1964</ymax>
      </bndbox>
   </object>
</annotation>

Мне нужно проанализировать значения <xmin> <ymin> <xmax> <ymax>

Я пробовал этот код.Но я не нашел никакого значения.

import xml.etree.ElementTree as ET
tree = ET.parse('Haritaki_010001.xml')
root = tree.getroot()

for country in root.findall('bndbox'):
    name = float(country.find('xmin').text)
    print(name)

Это обеспечивает пустой вывод.Кто-нибудь, пожалуйста, получите решение для меня?

1 Ответ

0 голосов
/ 08 ноября 2018

Из документации ElementTree :

Element.findall() находит только элементы с тегом, которые являются прямыми потомками текущего элемента.

Вы ищете вложенный элемент, поэтому findall() не может найти его из корня. То есть, если вы не используете выражение XPath .

Выражение .//bndbox найдет элемент в любом месте дерева. Возможно, вы захотите найти и обработать дочерние элементы, вы можете взять их имя после нахождения all . .//bbndbox/* найдет все дочерние элементы:

>>> root.findall('.//bndbox')
[<Element 'bndbox' at 0x10c1775e8>]
>>> root.findall('.//bndbox/*')
[<Element 'xmin' at 0x10c177638>, <Element 'ymin' at 0x10c177688>, <Element 'xmax' at 0x10c1776d8>, <Element 'ymax' at 0x10c177728>]

Используйте это для создания словаря (с пониманием словаря); Вы можете даже преобразовать содержащийся текст в целые числа в этой точке:

box = {e.tag: int(e.text) for e in root.findall('.//bndbox/*')}

Демо-версия:

>>> box = {e.tag: int(e.text) for e in root.findall('.//bndbox/*')}
>>> box
{'xmin': 316, 'ymin': 301, 'xmax': 1179, 'ymax': 1964}
>>> box['xmin']
316
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...