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

2024-09-29 09:25:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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”


Tags: 文件textinsourceforxmlamheader
1条回答
网友
1楼 · 发布于 2024-09-29 09:25:39

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

相关问题 更多 >