Я пытаюсь получить конкретные данные из 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?
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
Похожие вопросы
Связанные вопросы
Новые вопросы
element
В метаданных термин элемент данных является атомарной единицей данных, которая имеет точное значение или точную семантику.