【问题标题】:Python: large XML parsing with multiple children of root tree [duplicate]Python:具有多个根树子节点的大型 XML 解析 [重复]
【发布时间】:2019-02-05 06:39:37
【问题描述】:

需要用python(xml.etree.ElementTree)解析大的XML文件来处理和生成报告,如预期部分所示。

我无法弄清楚如何在第 4 级之前了解某些细节,然后再从第 5 级了解相关/相关数据。在哪里循环以及如何引用孩子,是我的问题。有什么建议请大家多多指教,谢谢。

Input XML File: raw_data.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<FirstLevel Flevel="my1">
    <SecondLevel Slevel="my2">
        <ThirdLevel Tlevel="my3">
            <FourthLevel test="1" mydata="Needed1">
                <FifthLevel associated="Required for Needed1"/>
            </Fourthlevel>  
            <FourthLevel test="2" mydata="Needed2">
                <FifthLevel associated="Required for Needed2"/>
            </Fourthlevel>  
            <FourthLevel test="3" mydata="Needed3">
                <FifthLevel associated="Required for Needed3-1"/>
                <FifthLevel associated="Required for Needed3-2"/>
            </Fourthlevel>  
            <FourthLevel test="4" mydata="Needed4">
                <FifthLevel associated="Required for Needed4-1"/>
                <FifthLevel associated="Required for Needed4-2"/>
            </Fourthlevel>  
        </ThirdLevel>
    </SecondLevel>
</FirstLevel>
-----------------------------------------------------------

My Code:

    import xml.etree.ElementTree as ET
    tree = ET.parse('raw_data.xml')
    root=tree.getroot()
    mylevel=root.findall('.//FourthLevel')
    for i in mylevel:
        print ("mydata=",i.get('mydata'),"\t")
        assoc=root.findall('.//FifthLevel') ### assoc: Temporary variable for associated data
        for j in assoc:
             print ("associated=",j.get('associated'),"\n")




Output: final_output.txt

mydata=Needed1  associated=Required for Needed1
mydata=Needed2  associated=Required for Needed2
mydata=Needed3  associated=Required for Needed3-1
mydata=Needed3  associated=Required for Needed3-1
mydata=Needed4  associated=Required for Needed4-1
mydata=Needed4  associated=Required for Needed4-1

【问题讨论】:

  • 试试root.findall('.//FifthLevel'),而不是i.findall('FifthLevel')

标签: python xml parsing


【解决方案1】:

您已经在迭代 root 的子节点,名称为 ".//FourthLevel"。您只需对每个名为 "FifthLevel" 的子项及其子项应用相同的原则(请注意缺少 斜杠es)。

翻译成代码,只需要换行:

assoc=root.findall('.//FifthLevel')

作者:

assoc = i.findall("FifthLevel")

因为您只需要 当前 节点(第 4th 级)的第 5th 级子节点,而不是整个树。更多详情请查看[Python 3.Docs]: xml.etree.ElementTree - The ElementTree XML API

【讨论】:

  • 那么您可能应该将答案标记为问题的解决方案(如果您被允许 - 考虑到问题是骗人的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多