使用 Python 从 xml 文件获取元素值
Get element value from xml file using Python
我需要使用 Python 从 .xml 文件中 extract/modify 一个元素。为此,我使用 xml.etree.ElementTree 但我没有从我的代码中获得所需的输出。我需要从 .xml 文件中提取元素 "address"(在本例中为 10.25.0.0):
<?xml version="1.0" encoding="utf-8"?>
<esc
xmlns="http://www.test.com/esc/esc">
<tenants>
<tenant>
<name>esc</name>
<deployments>
<deployment>
<name>xyz1000_Test_v1</name>
<networks>
<network>
<name>tenant_1</name>
<admin_state>true</admin_state>
<subnet>
<name>tenant_1_sub</name>
<ipversion>ipv4</ipversion>
**<address>10.25.0.0</address>**
</subnet>
</network>
<network> .....
我使用的代码如下:
import xml.etree.ElementTree as ET
tree = ET.parse('csr1kv_file.xml')
root = tree.getroot()
ET.register_namespace("","http://www.test.com/esc/esc")
for subnet in root.iter('address'):
print (subnet)
在代码之外,我没有得到任何错误和值(根据需要为 10.25.0.0)。有人可以给我一个主意吗?
我知道这可能不是您所期望的,但您可以随时尝试这样做:
with open('csr1kv_file.xml') as f:
address = str(f.read()).split("<address>")[1].split("</address>")[0]
编辑:我在这里回答,评论部分很难处理
如果您想将
值更改为其他内容,您可以尝试:
with open('csr1kv_file.xml') as f:
address = str(f.read()).split("<address>")[1].split("</address>")[0]
f_update = str(f.read()).replace("<address>" + str(address) + "</address>", "<address> whatever_address_you_want </address>")
with open('csr1kv_file.xml', 'w') as f2:
f2.write(f_update)
编辑编号 2:
这个使用您提供的示例数据在我的机器上正常工作:
with open('csr1kv_file.xml') as f:
full = f.read()
address = str(full).split("<address>")[1].split("</address>")[0]
f.close()
f_update = str(full).replace("<address>" + str(address) + "</address>","<address>whatever_ip</address>")
with open('csr1kv_file.xml', 'w') as f2:
f2.write(f_update)
f2.close()
当您遍历或搜索 XML 文档时,register_namespace()
无效。该函数仅在序列化(写入文件)时适用。
改变一下
for subnet in root.iter('address'):
到
for subnet in root.iter('{http://www.test.com/esc/esc}address'):
输出:
<Element '{http://www.test.com/esc/esc}address' at 0x030F3CF0>
(and possibly more address elements)
要获取输出中元素的值,请使用 print(subnet.text)
。
要设置元素的新值,请分配给 subnet.text
:
subnet.text = "whatever"
我需要使用 Python 从 .xml 文件中 extract/modify 一个元素。为此,我使用 xml.etree.ElementTree 但我没有从我的代码中获得所需的输出。我需要从 .xml 文件中提取元素 "address"(在本例中为 10.25.0.0):
<?xml version="1.0" encoding="utf-8"?>
<esc
xmlns="http://www.test.com/esc/esc">
<tenants>
<tenant>
<name>esc</name>
<deployments>
<deployment>
<name>xyz1000_Test_v1</name>
<networks>
<network>
<name>tenant_1</name>
<admin_state>true</admin_state>
<subnet>
<name>tenant_1_sub</name>
<ipversion>ipv4</ipversion>
**<address>10.25.0.0</address>**
</subnet>
</network>
<network> .....
我使用的代码如下:
import xml.etree.ElementTree as ET
tree = ET.parse('csr1kv_file.xml')
root = tree.getroot()
ET.register_namespace("","http://www.test.com/esc/esc")
for subnet in root.iter('address'):
print (subnet)
在代码之外,我没有得到任何错误和值(根据需要为 10.25.0.0)。有人可以给我一个主意吗?
我知道这可能不是您所期望的,但您可以随时尝试这样做:
with open('csr1kv_file.xml') as f:
address = str(f.read()).split("<address>")[1].split("</address>")[0]
编辑:我在这里回答,评论部分很难处理
如果您想将
值更改为其他内容,您可以尝试: with open('csr1kv_file.xml') as f:
address = str(f.read()).split("<address>")[1].split("</address>")[0]
f_update = str(f.read()).replace("<address>" + str(address) + "</address>", "<address> whatever_address_you_want </address>")
with open('csr1kv_file.xml', 'w') as f2:
f2.write(f_update)
编辑编号 2: 这个使用您提供的示例数据在我的机器上正常工作:
with open('csr1kv_file.xml') as f:
full = f.read()
address = str(full).split("<address>")[1].split("</address>")[0]
f.close()
f_update = str(full).replace("<address>" + str(address) + "</address>","<address>whatever_ip</address>")
with open('csr1kv_file.xml', 'w') as f2:
f2.write(f_update)
f2.close()
register_namespace()
无效。该函数仅在序列化(写入文件)时适用。
改变一下
for subnet in root.iter('address'):
到
for subnet in root.iter('{http://www.test.com/esc/esc}address'):
输出:
<Element '{http://www.test.com/esc/esc}address' at 0x030F3CF0>
(and possibly more address elements)
要获取输出中元素的值,请使用 print(subnet.text)
。
要设置元素的新值,请分配给 subnet.text
:
subnet.text = "whatever"