使用xml.etree.ElementTree捕获所有XML元素路径 [英] Capture all XML element paths using xml.etree.ElementTree

查看:0
本文介绍了使用xml.etree.ElementTree捕获所有XML元素路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用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的文档/示例。

我们的想法是:

  1. 以空列表作为路径
  2. Start事件中,将元素名称追加到路径并打印完整 路径目前已收集。
  3. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆