首页 > 解决方案 > 如何在同一元素级别收集文本节点?

问题描述

下面是示例 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>

标签: pythonxmlelementtree

解决方案


这可能会有所帮助。

演示:

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

推荐阅读