子元素有它的命名空间(不同于父元素的命名空间)。如何使用 LXML 查找 childe 元素?

时间:2021-07-18 13:10:45

标签: python xml xml-parsing lxml

我正在尝试查找一个 XML 子元素,并且这个子元素有它的默认命名空间,它不同于父元素的命名空间。 我想找到子元素并使用 LXML 更改其文本值。

具有默认命名空间的xml子元素是:

<mac xmlns="urn:b:interfaces:1.0">00:00:10:00:00:11</mac>

想法是:

1.输入参数:

  • 元素 xpath: ".//interfaces/interface/mac":
  • 所有相同元素的顺序:第一个
  • 元素文本的新值:10

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代码运行良好。

如何解析具有默认名称空间的子元素?

我花了几天时间寻找这个问题的根本原因,但似乎没有讨论相同的主题。

你能帮我解决这个问题吗?提前致谢!

0 个答案:

没有答案
相关问题