Я пытаюсь получить конкретные данные из XML-файла, а именно координаты X, Y, которые, на мой взгляд, являются атрибутами элемента с именем «Точка» в моем файле. Я не могу получить эти данные ничем, кроме кувалды, и с благодарностью приму некоторую помощь.

Я успешно использовал:

for Shooter in root.iter('Shooter'):
    print(Shooter.attrib)

Но если я попробую то же самое с "Point" (или "Points") выхода нет. Я даже не вижу «Точку», когда использую следующее:

for child in root:
   print(child.tag, child.attrib)

Итак: кувалда

print([elem.attrib for elem in root.iter()])

Что дает мне атрибуты для каждого элемента. Этот файл представляет собой единый набор данных и может содержать сотни точек данных, поэтому я предпочел бы попытаться быть немного более тонким и сосредоточиться именно на том, что мне нужно.

Мой XML-файл https://pastebin.com/abQT3t9k

ОБНОВЛЕНИЕ: Спасибо за ответы. Я попробовал опубликованное решение и получил 7000 строк, которые были не совсем тем, что мне было нужно. Я должен был объяснить более подробно. Я также пробовал (как было предложено)

def find_rec(node, element, result):
    for item in node.findall(element):
        result.append(item)
        find_rec(item, element, result)
        return result

print(find_rec(ET.parse(filepath_1), 'Shooter', [])) #Returns <Element            'Shooter' at 0x125b0f958>
print(find_rec(ET.parse(filepath_1), 'Point', []))   #Returns None

Я признаю, что никогда раньше не работал с XML-файлами, и я новичок в Python (но мне это нравится). Я хотел получить решение сам, но я потратил несколько дней, чтобы никуда не деться.

Возможно, мне следовало с самого начала спросить, как извлечь данные XY для каждого ShotNbr (в этом файле есть только один), но я не хотел, чтобы за меня писали код.

Мне удалось получить XY из этого файла, но мой код никогда не будет работать, если есть более одного выстрела или если я хочу специально посмотреть, скажем, на выстрел номер 20.

Как найти снимок номер 2 (ShotNbr="2") и извлечь только его точки данных XY?

0
owen b 10 Апр 2020 в 18:55
Добро пожаловать в СО! Чтобы получить всю необходимую помощь, вам нужно дать полный контекст: включить импорт. Неясно, используете ли вы xml.etree.ElementTree.
 – 
xor007
11 Апр 2020 в 08:42
См. stackoverflow .com/questions/30097949/… для решения
 – 
xor007
11 Апр 2020 в 08:43

1 ответ

Предполагая, что вы используете:

xml.etree.ElementTree,

Вы смотрите только на прямых потомков root.

Вам нужно вернуться в дерево, чтобы получить доступ к элементам ниже в иерархическом дереве.

Похоже, это та же проблема, что и ElementTree - findall для рекурсивного выбора все дочерние элементы

У которого есть отличный ответ, что я не собираюсь заниматься плагиатом.

Просто примените его.

В качестве альтернативы,

import xml.etree.ElementTree as ET
root = ET.parse("file.xml")
print root.findall('.//Point')

Должно сработать.

См.: https://docs.python. org/2/library/xml.etree.elementtree.html#supported-xpath-syntax

0
xor007 11 Апр 2020 в 09:00