簡體   English   中英

如何使用python修改XML中的元素文本

[英]How to modify element text in XML using python

你能給我一些建議如何使用 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')[0] 中的 BBB:

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

如果您只需要更新單個標簽,則無需迭代所有標簽。

嘗試:

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')

ElementTree支持XPath 的有限子集

您可以使用

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

獲得樹中第一個這樣的節點,或者

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

遍歷所有這些。

免責聲明: @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的有效性以避免崩潰。

希望這可以幫助。

那么你可以這樣做:

for a in tree:
    for c in a:
        for b in c:
            b.text = '11111' + b.text
            break
        break
    break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM