0

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

  1. 我可以很容易地解析 XML 中的字符串值(主机名、颜色、类名等),但是本质上的任何数字(IP 地址/子网掩码等)我都做得不正确。如何让它显示正确的虚线四边形?

  2. 从更深层次的孩子身上提取信息的正确方法是什么(使用 minidom)?(请参阅组对象 - 参考下需要“名称”)

  3. 当字段不包含值(例如网络掩码)时,如何清理(删除)错误的 []。

XML 看起来像两个输出之一(已清理):

a) 主机对象:

<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:列表索引超出范围”

4

1 回答 1

0

除了如何正确处理 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)
于 2013-03-22T12:25:56.603 回答