如何在Python中找到默认命名空间的XML子元素?

How to find a XML child element which has a default namespace in Python?

我的目标是找到具有默认名称的 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()

我在Whosebug上翻了一下,没有类似的答案。

你能给我一些提示吗? 谢谢!

您的代码似乎有点太复杂了。尝试以下方法到达 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

感谢 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>