如何在相同元素级别收集文本节点?

时间:2018-05-22 08:44:44

标签: python xml elementtree

下面的

是示例xml。 我正在学习xml.etree.ElementTree模块而不是lxml。

<data>
    <AAA>
        <CCC>
            <BBB>This</BBB>
        </CCC>
        <CCC>  
            <BBB>is</BBB>
        </CCC>
        <CCC>
            <BBB>test1</BBB>
        </CCC>
    </AAA>

    <AAA>
        <CCC>
            <BBB>This is test</BBB>
        </CCC>
    </AAA>

   <AAA>
        <CCC>
            <BBB>222222</BBB>
        </CCC>
        <CCC>
            <BBB>333333</BBB>
        </CCC>      
    </AAA>  

    <AAA>
        <BBB>
            <CCC>This is test</CCC>
        </BBB>
    </AAA>
</data>

我试图在AAA元素下收集CCC下的所有BBB文本。 但我不知道为什么它不起作用。启动时没有错误,但没有收集文本。 我想知道为什么这段代码不能很好地运作。

BBB_collect = ''.join(BBB.itertext())

请查看以下

import xml.etree.ElementTree as ET
import re

f1 = open ("C:\\test\\Data.xml","r",encoding="utf=8")
f2 = open ("C:\\test\\output.xml","wt",encoding="utf=8")
doc = ET.parse("C:\\test\\Data.xml")
root = doc.getroot()
a = 0

try:
    while True :
        AAA = root.findall('AAA')[a]
        for CCC in AAA.findall('CCC'):
            for BBB in CCC.findall('BBB'):
                BBB_collect = ''.join(BBB.itertext())
                print(BBB_collect)
        print('===============')
        a = a+1
except IndexError :
    pass

你能给我任何建议吗?它有什么问题?

最终,这是我的目标。

<data>
    <AAA>
        <CCC>
            <BBB>Thisistest1</BBB>
        </CCC>
    </AAA>

    <AAA>
        <CCC>
            <BBB>This is test</BBB>
        </CCC>
    </AAA>

    <AAA>
        <CCC>
            <BBB>222222333333</BBB>
        </CCC>
    </AAA>  

    <AAA>
        <BBB>
            <CCC>This is test</CCC>
        </BBB>
    </AAA>
</data>

1 个答案:

答案 0 :(得分:1)

这可能会有所帮助。

<强>演示:

import xml.etree.ElementTree as ET
doc = ET.fromstring(data)   

for AAA in doc.findall('AAA'):
    bText = ""
    for CCC in AAA.findall('CCC'):
        for BBB in CCC.findall('BBB'):
            bText += BBB.text
    print(bText)

<强>输出:

Thisistest1
This is test
222222333333
This is test