Python的minidom命名XML解析点分四组/嵌套子(Python Minidom XML p

2019-10-29 05:55发布

我有不同的对象,我需要解析,并有多个问题的一个巨大的列表:

  1. XML中的字符串值,我能够分析很容易(主机名,颜色,CLASS_NAME等),但什么是自然数(IP地址/子网掩码等)我没有做正确。 我如何得到它,以显示正确的点分四组?

  2. 什么是正确的方法(使用minidom命名)拉出来的信息更深层的孩子? (请参阅组对象 - 需要“名称”下参考)

  3. 我怎样才能清理(删除)错误的[]当一个字段不包含一个值(子网掩码实例)。

XML看起来像两个输出之一(消毒):

一)主机对象:

<network_object>
<Name>DB1</Name>
<Class_Name>host_plain</Class_Name>
<color><![CDATA[black]]></color>
<ipaddr><![CDATA[192.168.100.100]]></ipaddr>

B)组对象(包含多个成员):

  <network_object>
<Name>DB_Servers</Name>
<Class_Name>network_object_group</Class_Name>
<members>
  <reference>
    <Name>DB1</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>DB2</Name>
    <Table>network_objects</Table>
  </reference>
</members>
<color><![CDATA[black]]></color>

我的代码电流输出看起来像这样的主机对象:

DB1 host_plain black [<DOM Element: ipaddr at 0x2d05a50>] []

对于网络对象:

Net_192.168.100.0 network black [<DOM Element: ipaddr at 0x399add0>] [<DOM Element: netmask at 0x399af10>]

为一组对象:

DB_Servers network_object_group black [] []

我的代码:

from xml.dom import minidom

net_xml = minidom.parse("network_objects.xml")

NetworkObjectsTag = net_xml.getElementsByTagName("network_objects")[0]

# Pull individual network objects
NetworkObjectTag = NetworkObjectsTag.getElementsByTagName("network_object")

for network_object in NetworkObjectTag:
    name = network_object.getElementsByTagName("Name")[0].firstChild.data
    class_name = network_object.getElementsByTagName("Class_Name")[0].firstChild.data
    color = network_object.getElementsByTagName("color")[0].firstChild.data
    ipaddr = network_object.getElementsByTagName("ipaddr")
    netmask = network_object.getElementsByTagName("netmask")
    print(name,class_name,color,ipaddr,netmask)

编辑:我已经能够得到一些输出解决#1,但它似乎我达到极限,我还没有意识的。

新的代码:

ipElement = network_object.getElementsByTagName("ipaddr")
ipaddr = ipElement.firstChild.data
maskElement = network_object.getElementsByTagName("netmask")
netmask = maskElement.firstChild.data

给了我,我要找的输出,但它似乎6-9项提的是,之后停止“builtins.IndexError:列表索引超出范围”

Answer 1:

我已经能够回答我所有的问题只是如何妥善处理network_group_object。 我会再拍职位特异性。

这是我的新的代码:

from xml.dom import minidom

net_xml = minidom.parse("network_objects.xml")

NetworkObjectsTag = net_xml.getElementsByTagName("network_objects")[0]

# Pull individual network objects
NetworkObjectTag = NetworkObjectsTag.getElementsByTagName("network_object")

for network_object in NetworkObjectTag:
name = network_object.getElementsByTagName("Name")[0].firstChild.data
class_name = network_object.getElementsByTagName("Class_Name")[0].firstChild.data
color = network_object.getElementsByTagName("color")[0].firstChild.data
ipElement = network_object.getElementsByTagName("ipaddr")
if ipElement:    
    ipElement = network_object.getElementsByTagName("ipaddr")[0]
    ipaddr = ipElement.firstChild.data
maskElement = network_object.getElementsByTagName("netmask")
if maskElement:
    maskElement = network_object.getElementsByTagName("netmask")[0]
    netmask = maskElement.firstChild.data
#address_ranges
ipaddr_firstElement = network_object.getElementsByTagName("ipaddr_first")
if ipaddr_firstElement:
    ipaddr_firstElement = network_object.getElementsByTagName("ipaddr_first")[0]
    ipaddr_first = ipaddr_firstElement.firstChild.data
ipaddr_lastElement = network_object.getElementsByTagName("ipaddr_last")
if ipaddr_lastElement:
    ipaddr_lastElement = network_object.getElementsByTagName("ipaddr_last")[0]
    ipaddr_last = ipaddr_lastElement.firstChild.data    
if ipaddr_firstElement:
    print(name,class_name,ipaddr,netmask,ipaddr_first,ipaddr_last,color)
else:
        print(name,class_name,ipaddr,netmask,color)


文章来源: Python Minidom XML parsing dotted quad/nested children
标签: python xml linux