Python 缺少ELementTree第一个子函数

Python 缺少ELementTree第一个子函数,python,xml,parsing,Python,Xml,Parsing,我正在用python编写一个解析器来解析xml文件。为此,我需要得到标记名,但当我这样做时,连同标记名,我也得到了名称空间。除此之外,我还需要在许多位置获取第一个子元素,在这个包Elementtree中我找不到任何属性。我搜索了很多,但找不到如何只获取标记名,而不包含名称空间值和第一个子项。trialinput.xml文件如下所示: <?xml version="1.0"?> <nf:rpc-reply xmlns:nf="urn:ietf:params:xml:ns:netc

我正在用python编写一个解析器来解析xml文件。为此,我需要得到标记名,但当我这样做时,连同标记名,我也得到了名称空间。除此之外,我还需要在许多位置获取第一个子元素,在这个包Elementtree中我找不到任何属性。我搜索了很多,但找不到如何只获取标记名,而不包含名称空间值和第一个子项。trialinput.xml文件如下所示:

<?xml version="1.0"?>
<nf:rpc-reply xmlns:nf="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="http://www.cisco.com/nxos:1.0:ip">
 <nf:data>
  <show>
   <ip>
    <interface>
     <__XML__BLK_Cmd_ip_show_interface_command_brief>
      <__XML__OPT_Cmd_ip_show_interface_command_operational>
       <__XML__OPT_Cmd_ip_show_interface_command_vrf>
        <__XML__OPT_Cmd_ip_show_interface_command___readonly__>
         <__readonly__>
    <TABLE_intf>

        <ROW_intf>
                <vrf-name-out>default</vrf-name-out>
                <intf-name>Vlan10</intf-name>
                <prefix>9.1.1.1</prefix>
                <ip-disabled>FALSE</ip-disabled>
                <iod>104</iod>
                <proto-state>TRUE</proto-state>
                <link-state>TRUE</link-state>
                <admin-state>TRUE</admin-state>
               </ROW_intf>
        <ROW_intf>
                <vrf-name-out>default</vrf-name-out>
                <intf-name>Vlan23</intf-name>
                <prefix>23.1.1.9</prefix>
                <ip-disabled>FALSE</ip-disabled>
                <iod>103</iod>
                <proto-state>TRUE</proto-state>
                <link-state>TRUE</link-state>
                <admin-state>TRUE</admin-state>
             </ROW_intf>
             <ROW_intf>
                <vrf-name-out>default</vrf-name-out>
                <intf-name>Po1</intf-name>
                <prefix>4.9.1.2</prefix>
                <ip-disabled>FALSE</ip-disabled>
                <iod>111</iod>
                <proto-state>TRUE</proto-state>
                <link-state>TRUE</link-state>
                <admin-state>TRUE</admin-state>
             </ROW_intf>
             <ROW_intf>
                <vrf-name-out>default</vrf-name-out>
                <intf-name>Po2</intf-name>
                <prefix>5.9.1.2</prefix>
                <ip-disabled>FALSE</ip-disabled>
                <iod>112</iod>
                <proto-state>TRUE</proto-state>
                <link-state>TRUE</link-state>
                <admin-state>TRUE</admin-state>
             </ROW_intf>
             <ROW_intf>
                <vrf-name-out>default</vrf-name-out>
                <intf-name>Po3</intf-name>
                <prefix>6.9.1.2</prefix>
                <ip-disabled>FALSE</ip-disabled>
                <iod>113</iod>
                <proto-state>TRUE</proto-state>
                <link-state>TRUE</link-state>
                <admin-state>TRUE</admin-state>
             </ROW_intf>
    </TABLE_intf>
    </__readonly__>
        </__XML__OPT_Cmd_ip_show_interface_command___readonly__>
       </__XML__OPT_Cmd_ip_show_interface_command_vrf>
      </__XML__OPT_Cmd_ip_show_interface_command_operational>
     </__XML__BLK_Cmd_ip_show_interface_command_brief>
    </interface>
   </ip>
  </show>
 </nf:data>
</nf:rpc-reply>

要删除标记上的命名空间,请执行以下操作:

import re
def GetBareTag(tag): return re.sub(r'{.*?}', '', tag)
要查找第一个孩子:

def GetFirstChild(e): return e[0] if len(e) else None

您缺少的是名称空间的正确使用

由于xml文件中有名称空间,节点将有名称空间,ET将返回名称空间和标记

尝试以下操作以提取正确的节点:

xmlDoc = ET.parse("trialinput.xml")  
dict = {}
print "accessing the root"
root = xmlDoc.getroot()

print "rootname == %s" %root.tag
pointerOfReadonly = root.findall(".//{http://www.cisco.com/nxos:1.0:ip}__readonly__")
print pointerOfReadonly
前两个节点rpc reply和data将包含名称空间urn:ietf:params:xml:ns:netconf:base:1.0,其他节点将包含http://www.cisco.com/nxos:1.0:ip

有关xpath语法和用法的概述,请查看

因此,在搜索节点uu readonly uuu时,需要在findall方法中显式指定名称空间,如下所示:

pointerOfReadonly = root.findall(".//{http://www.cisco.com/nxos:1.0:ip}__readonly__")
print pointerOfReadonly
在本例中,它只打印所有找到的节点的列表1:

[<Element '{http://www.cisco.com/nxos:1.0:ip}__readonly__' at 0x20b4990>]
然后打印所有找到的5个节点:

[<Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4990>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4bb0>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4db0>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4f90>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20dc190>]

你的问题是什么?
pointerOfRowIntf = root.findall(".//{http://www.cisco.com/nxos:1.0:ip}ROW_intf")
print pointerOfRowIntf
[<Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4990>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4bb0>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4db0>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20d4f90>, <Element '{http://www.cisco.com/nxos:1.0:ip}ROW_intf' at 0x20dc190>]