我有一个需要解析的不同对象的巨大列表,并且有多个问题:
我可以很容易地解析 XML 中的字符串值(主机名、颜色、类名等),但是本质上的任何数字(IP 地址/子网掩码等)我都做得不正确。如何让它显示正确的虚线四边形?
从更深层次的孩子身上提取信息的正确方法是什么(使用 minidom)?(请参阅组对象 - 参考下需要“名称”)
当字段不包含值(例如网络掩码)时,如何清理(删除)错误的 []。
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:列表索引超出范围”