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”。
答案 0 :(得分:0)
您的for循环可以完成此工作:它确实替换了文本。更改在您的root
变量中。您可以通过在for循环之后添加以下行来验证这一点:
ElementTree.dump(root)
现在,您已经更新了XML,则需要将其写入文件:
tree.write('newfile.xml')
tree
是ElementTree.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”,需要在写之前注册名称空间:
ElementTree.register_namespace('', 'URL/sampleMessages-v1')
tree.write('messages-new.xml')