如何使用python

时间:2018-05-29 12:41:53

标签: python xml

您能否告诉我如何使用python修改XML中的元素文本? 如果我想在第一个BBB元素的文本前面插入其他文本,我应该在下面的代码中更改哪个部分?

请不要使用fromstring和其他模块(例如lxml)。

这是下面的示例XML。

<?xml version="1.0"?>
<data>
    <AAA>
        <CCC>
            <BBB>This</BBB> ----> the first BBB element
        </CCC>
        <CCC>  
            <BBB>is</BBB>
        </CCC>
        <CCC>
            <BBB>test1</BBB>
        </CCC>
    </AAA>

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

以及我在下面尝试的代码。

import xml.etree.ElementTree as ET
import re

tree = ET.parse("C:\\test\\python test\\data_text.xml")
root = tree.getroot()                                                

for AAA in root.findall('AAA'):
    for CCC in AAA.findall('CCC'):
        for BBB in CCC.findall('BBB')[0]:
            BBB_text = '11111' + BBB.text
            print(BBB_text)

tree.write('C:\\test\\python test\\output.xml')

据我所知,对于CCC.findall中的BBB(&#39; BBB&#39;)[0]:

[0]意味着只找到第一个BBB,但我认为这是错误的。

这就是我想要的结果。

<?xml version="1.0"?>
<data>
    <AAA>
        <CCC>
            <BBB>11111This</BBB> ----> the first BBB element
        </CCC>
        <CCC>  
            <BBB>is</BBB>
        </CCC>
        <CCC>
            <BBB>test1</BBB>
        </CCC>
    </AAA>

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

4 个答案:

答案 0 :(得分:1)

如果您只需要更新单个标记,则无需迭代所有标记。

<强>尝试:

import xml.etree.ElementTree as ET

tree = ET.parse(filename)
root = tree.getroot()                                                

for AAA in root.findall('AAA'):
    if AAA.find('CCC'):
        BBB = AAA.find('CCC').find('BBB')
        BBB.text = '33333' + BBB.text

tree.write('C:\\test\\python test\\output.xml')

答案 1 :(得分:1)

ElementTree支持a limited sub-set of XPath

您可以使用

bbb = tree.find("./AAA/CCC/BBB")
if bbb:
    # do something   

获取树中的第一个这样的节点,或

for bbb in tree.iterfind("./AAA/CCC/BBB"):
    # do something

迭代所有这些。

答案 2 :(得分:0)

编辑:来自@Tomalak的XPath答案更优雅!

经过一些测试后,看起来CCC.findall('BBB')[0]工作正常。 由于您需要文档中的第一个BBB标记而不是每个AAA标记内的标记,因此我会松开for循环并修改评论中的位。我明白了:

import xml.etree.ElementTree as ET
import re

tree = ET.parse("data_text.xml")
root = tree.getroot()                                                

AAA = root.find('AAA')
CCC = AAA.find('CCC')
BBB = CCC.find('BBB')
BBB.text = '11111' + BBB.text
print(BBB.text)

tree.write('output.xml')
似乎要做的伎俩。如果XML不包含此类标记,您可能需要检查AAABBBCCC的有效性,以避免崩溃。

希望这有帮助。

答案 3 :(得分:0)

你可以这样做:

allprojects {
    repositories {
        .....
        ......
        maven { url 'https://maven.google.com' }  //  Add this line.
        ......
    } }