使用xml.etree.ElementTree捕获所有XML元素路径 [英] Capture all XML element paths using xml.etree.ElementTree
问题描述
使用python导入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()";等进行了猜测,希望发现一个未记录的功能。失败。
可能我遇到的是用户错误的极端情况,如果这是重复的,请原谅。
我认为我在这里找到了答案:Get Xpath dynamically using ElementTree getpath()但XPath Evaluator似乎只对一个‘已知’元素进行操作-它没有&Quot;Get Me Everything&Quot;的选项。
以下是我尝试的内容:
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文档的理解,它们只对"已知"的元素名称进行操作。即tree.xPath()似乎要求预先知道元素名称。
推荐答案
起点:
import xml.etree.ElementTree as et
解决问题的一个有趣方法是使用iterparse-an 迭代分析器包含在ElementTree中。
它能够针对解析的每个元素报告例如每个开始和结束事件。 有关详细信息,请在Web上搜索iterparse的文档/示例。
我们的想法是:
- 以空列表作为路径。
- 在Start事件中,将元素名称追加到路径并打印完整 路径目前已收集。
- 在End事件中,从路径中删除最后一个元素。
您甚至可以将此代码包装在生成器函数中:
def pathGen(fn):
path = []
it = et.iterparse(fn, events=('start', 'end'))
for evt, el in it:
if evt == 'start':
path.append(el.tag)
yield '/'.join(path)
else:
path.pop()
现在,当您运行:
for pth in pathGen('Input.xml'):
print(pth)
您将获得所有元素的完整路径的打印输出
在您的源文件中,类似于:
TreatmentEpisodes
TreatmentEpisodes/TreatmentEpisode
TreatmentEpisodes/TreatmentEpisode/SourceRecordIdentifier
TreatmentEpisodes/TreatmentEpisode/FederalTaxIdentifier
TreatmentEpisodes/TreatmentEpisode/ClientSourceRecordIdentifier
TreatmentEpisodes/TreatmentEpisode
TreatmentEpisodes/TreatmentEpisode/SourceRecordIdentifier
TreatmentEpisodes/TreatmentEpisode/FederalTaxIdentifier
TreatmentEpisodes/TreatmentEpisode/ClientSourceRecordIdentifier
...
这篇关于使用xml.etree.ElementTree捕获所有XML元素路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!