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