使用XML.etree.ElementTree捕获所有XML元素路径

2024-10-01 13:45:59 发布

您现在位置:Python中文网/ 问答频道 /正文

使用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()”等,希望发现一个未记录的特性。失败

也许我遇到了一个“用户错误”的极端情况,如果这是重复的,请原谅我

我想我在这里找到了答案:Get Xpath dynamically using 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文档只对“已知”元素名进行操作。即tree.XPath()似乎要求事先知道元素名


Tags: import路径tree元素parserootxmllxml
1条回答
网友
1楼 · 发布于 2024-10-01 13:45:59

开始于:

import xml.etree.ElementTree as et

解决问题的一个有趣方法是使用iterparse-An 迭代解析器包含在元素树

它能够为每个分析的元素报告例如每个开始结束事件。 有关详细信息,请在Web上搜索iterparse的文档/示例

其想法是:

  1. 从一个空列表开始,作为路径
  2. 开始事件时,将元素名称附加到路径并打印完整的 到目前为止收集的路径
  3. 结束事件时,从路径中删除最后一个元素

您甚至可以将此代码包装到一个生成器函数中

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
...

相关问题 更多 >