我正在尝试查找一个 XML 子元素,并且这个子元素有它的默认命名空间,它不同于父元素的命名空间。 我想找到子元素并使用 LXML 更改其文本值。
具有默认命名空间的xml子元素是:
<mac xmlns="urn:b:interfaces:1.0">00:00:10:00:00:11</mac>
想法是:
1.输入参数:
2.查找元素:
<mac xmlns="urn:b:interfaces:1.0">00:00:10:00:00:11</mac>
我的代码:
XML 文件 test.xml:
<?xml version='1.0' encoding='utf-8'?>
<a:config xmlns:a="urn:base:1.0">
<interfaces xmlns="urn:a-interfaces">
<interface>
<name>eth0</name>
<enabled>true</enabled>
<ipv4 xmlns="urn:b-ip">
<enabled>true</enabled>
</ipv4>
<tagging xmlns="urn:b:interfaces:1.0">true</tagging>
<mac xmlns="urn:b:interfaces:1.0">00:00:10:00:00:11</mac>
</interface>
<interface>
<name>eth0-A</name>
<enabled>true</enabled>
<ipv4 xmlns="urn:b-ip">
<enabled>true</enabled>
</ipv4>
<base-interface xmlns="urn:b:interfaces:1.0">eth0</base-interface>
<id xmlns="urn:b:interfaces:1.0">1</id>
<mac xmlns="urn:b:interfaces:1.0">00:00:10:00:00:11</mac>
</interface>
</interfaces>
</a:config>
Python 代码:
def set_element_value(file_name, element, new_value, element_order):
filename = file_name
tree = etree.parse(filename)
root = tree.getroot()
xml_string = etree.tostring(tree).decode('utf-8')
name_space_dict = {}
for node in root:
name_space_dict = dict(node.nsmap)
count_order = 0
for ele in root.findall(element, namespaces=name_space_dict):
if count_order == element_order:
ele.text = str(new_value)
count_order += 1
def main():
filename ="../test.xml"
element_xpath = ".//interfaces/interface/mac"
new_value = "10"
element_order = 0
set_element_value(filename, element_xpath, new_value, element_order)
if __name__ == '__main__':
main()
我的python代码找不到:
<mac xmlns="urn:b:interfaces:1.0">00:00:10:00:00:11</mac>
但是如果我将“mac”的命名空间删除为:
<mac>00:00:10:00:00:11</mac>
那么python代码运行良好。
如何解析具有默认名称空间的子元素?
我花了几天时间寻找这个问题的根本原因,但似乎没有讨论相同的主题。
你能帮我解决这个问题吗?提前致谢!