【问题标题】:How to find a XML child element which has a default namespace in Python?如何在 Python 中找到具有默认命名空间的 XML 子元素?
【发布时间】:2021-07-23 10:11:28
【问题描述】:

我的目标是找到具有默认名称的 XML 子元素。

XML:

<?xml version='1.0' encoding='UTF-8'?>
<all:config xmlns:all="urn:base:1.0">
    <interfaces xmlns="urn:ietf-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>
  </interfaces>
</all:config>

我想找到以下元素:

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

并更改 mac 的文本。

我有以下问题:

  1. mac的xpath是什么?
  2. 我如何使用 xpath 找到“mac”,因为它具有默认命名空间?

我的代码不起作用:

def set_element_value(file_name, element, new_value, order):
    filename = file_name
    tree = etree.parse(filename)
    root = tree.getroot()
    xml_string = etree.tostring(tree).decode('utf-8')
    my_own_namespace_mapping = {'prefix': 'urn:b:interfaces:1.0'}
    myele = root.xpath('.//prefix:mac', namespaces=my_own_namespace_mapping)
    myele[0].text = "aaa"
    for ele in root.xpath('.//prefix:mac', namespaces=my_own_namespace_mapping):
        if count_order == order:
            ele.text = str(new_value)
        count_order += 1
def main():
    filename ="./template/b.xml"
    element = ".//interfaces/interface/mac"
    new_value = "10"
    order = 0
    set_element_value(filename, element, new_value, order)
if __name__ == '__main__':
    main()

我试图在stackoverflow中挖掘出来,但没有类似的答案。

你能给我一些建议吗? 谢谢!

【问题讨论】:

    标签: python xml xpath lxml


    【解决方案1】:

    感谢 Jack 的方法,我解决了这个问题:

    新代码:

    def set_element_value(file_name, element, new_value, order):
        filename = file_name
        tree = etree.parse(filename)
        tag_list = tree.xpath('.//*[local-name()="mac"]')
        print("tag:", tag_list, " and tag value:", tag_list[0].text)
        tag_list[0].text = "10"
        xml_string = etree.tostring(tree).decode('utf-8')
        print(xml_string)
    
    def main():
        filename ="./template/b.xml"
        element = "mac"
        new_value = "10"
        order = 1
        set_element_value(filename, element, new_value, order)
    
    if __name__ == '__main__':
        main()
    

    输出:

    tag: [<Element {urn:ietf-interfaces}mac at 0x298fc4b69c0>]  and tag value: 10
    <all:config xmlns:all="urn:base:1.0">
        <interfaces xmlns="urn:ietf-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 xmln="urn:b:interfaces:1.0">10</mac>
            </interface>
      </interfaces>
    </all:config>
    

    【讨论】:

      【解决方案2】:

      您的代码似乎有点过于复杂。尝试以下方法获取mac地址:

      ns = {"x":"urn:b:interfaces:1.0"}
      root.xpath('//x:mac/text()',namespaces=ns)[0]
      

      或者如果您不想处理命名空间:

      root.xpath('//*[local-name()="mac"]/text()')[0]
      

      两种情况下的输出都是

      00:00:10:00:00:11
      

      【讨论】:

      • 是的!你的方法效果很好!非常感谢!
      猜你喜欢
      • 2018-10-08
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多