Используя python import lxml, я могу рекурсивно распечатать список путей для каждого элемента:
from lxml import etree
root = etree.parse(xml_file)
for e in root.iter():
path = root.getelementpath(e)
print(path)
Результаты:
TreatmentEpisodes
TreatmentEpisodes/TreatmentEpisode
TreatmentEpisodes/TreatmentEpisode/SourceRecordIdentifier
TreatmentEpisodes/TreatmentEpisode/FederalTaxIdentifier
TreatmentEpisodes/TreatmentEpisode/ClientSourceRecordIdentifier
etc.
Примечание. Я работаю с этим XSD: https://www.myflfamilies.com/service-programs/samh/155-2/155-2-v14/schemas/TreatmentEpisodeDataset.xsd
Я хочу сделать то же самое, используя импортировать xml.etree.ElementTree как ET ... но ElementTree, похоже, не имеет функции, эквивалентной lxml getelementpath().
Я прочитал документы. Я гуглил несколько дней. Я экспериментировал с XPath. Я догадался использовать iter() и пробовал "getpath()", "Element.getpath()" и т. д., надеясь обнаружить недокументированную функцию. Ошибка.
Возможно, я столкнулся с крайним случаем "ошибки пользователя", и, пожалуйста, простите меня, если это дубликат.
Я думал, что нашел ответ здесь: Получить Xpath динамически, используя ElementTree getpath(), но XPathEvaluator, похоже, работает только с «известным» элементом — у него нет опции «дайте мне все".
Вот что я пробовал:
import xml.etree.ElementTree as ET
tree = etree.parse(xml_file)
for entry in tree.xpath('//TreatmentEpisode'):
print(entry)
Результаты:
<Element TreatmentEpisode at 0xffff8f8c8a00>
На что я надеялся:
TreatmentEpisodes/TreatmentEpisode
...однако, даже если я получил то, на что надеялся, я все еще не уверен, как получить полный путь для каждого элемента. Насколько я понимаю документы XPath, они работают только с «известными» именами элементов.
Похоже, вы провели исследование и попытались решить эту проблему с помощью кода ... теперь предоставьте хотя бы то, что вы «экспериментировали с XPath», ваш код - даже если это не удалось: минимальный воспроизводимый пример. Итак, мы видим, как приспособиться.
Справедливо. Я могу сказать следующее: я думал, что нашел ответ здесь: coderhelper.com/questions/13136334/…, но XPathEvaluator, кажется, работает только с «известным» элементом — у него нет опции для "дай мне все". Тем не менее, я соберу больше примеров того, что я пробовал, и отредактирую свой вопрос.
@hc_dev вопрос обновлен с попыткой примера.
Не должно быть слишком сложно написать функцию для построения пути элемента. Вы пробовали это?
Я беру это назад - не понял, что родительского атрибута нет :-( Однако это показывает способ создания дочернего-> родительского словаря, который может легко стать основой для получения пути к элементу coderhelper.com/ вопросы/2170610/…
@barny - твой первый комментарий был уловкой. Я никогда не пробовал пример функции во второй половине ссылки SO, которую я цитировал в своем собственном вопросе! Определенно здесь происходит серьезная ошибка пользователя, поскольку я только что попробовал эту функцию по вашему предложению, и она сработала! Возможно, мои глаза отказали от чтения слишком большого количества форумов, но это был ответ прямо передо мной. Пост Давиде Брунато должен быть отмечен суперфлагом или что-то в этом роде.
Вы, вероятно, должны проголосовать за этот ответ
@барни пытался. Не пускает, пока у меня не будет "15 репутации". Я прятался здесь 15 лет - это был мой первый пост. :(
Хорошо - постарайтесь не забыть проголосовать, как только у вас появится представитель