我想使用python代码更新特定xml标签的值吗?

时间:2018-08-20 12:49:24

标签: python xml

My xml file looks like below :-


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Messages xmlns="URL/sampleMessages-v1">
    <Header>
        <TransactionId>0</TransactionId>
        <RequestNo>41194812</RequestNo>
        <VNo>6789</VNo>
        <Source></Source>
    </Header>
...
...

</Messages>

我想阅读并更改RequestNo值

 <RequestNo>41194812</RequestNo> to 
        <RequestNo>41194000</RequestNo>

I am using ElementTree module  currently. I am using windows machine currently.

我要更新同一文件中的值。

我尝试过以下代码:-

for elem in root:
    for subelem in elem:
      #print (subelem.tag)
        if 'RequestNo' in subelem.tag :
            #print (subelem.text)
            subelem.text="41194813"

但是我看不到更改,或者我目前不知道如何在现有的xml文件中写入此新值subelem.text =“ 41194813”。

1 个答案:

答案 0 :(得分:0)

您的for循环可以完成此工作:它确实替换了文本。更改在您的root变量中。您可以通过在for循环之后添加以下行来验证这一点:

ElementTree.dump(root)

现在,您已经更新了XML,则需要将其写入文件:

tree.write('newfile.xml')

treeElementTree.parse()的结果。因此,将所有内容放在一起:

tree = ElementTree.parse('messages.xml')
root = tree.getroot()

for elem in root:
    for subelem in elem:
        if 'RequestNo' in subelem.tag:
            subelem.text = '41194813'
            break
tree.write('messages-new.xml')

处理命名空间

您的XML文档包含名称空间,因此,如果您打算搜索标签,则需要在标签名称中包含名称空间。这是处理名称空间的替代解决方案:

tree = ElementTree.parse('messages.xml')
root = tree.getroot()

namespaces = {'xxx': 'URL/sampleMessages-v1'}
node = root.find('xxx:Header/xxx:RequestNo', namespaces)
if node is not None:
    node.text = '41194813'

tree.write('messages-new.xml')

在上面的示例中,我只是给您的命名空间命名为“ xxx”,它可以是任何“ foo”,“ bar”,...,但应用作对root.find()的调用的前缀。

从输出文件中删除“ ns0”

为了从输出文件中删除“ ns0”,需要在写之前注册名称空间:

ElementTree.register_namespace('', 'URL/sampleMessages-v1')
tree.write('messages-new.xml')