0

解析する必要のあるさまざまなオブジェクトの膨大なリストがあり、複数の質問があります。

  1. XML内の文字列値(ホスト名、色、クラス名など)は非常に簡単に解析できますが、数値的な性質(IPアドレス/サブネットマスクなど)は正しくありません。正しい点線のクワッドを表示するにはどうすればよいですか?

  2. より深い子供たちから情報を引き出すための正しい方法(ミニドムを使用)は何ですか?(グループオブジェクトを参照してください-参照の下に「名前」が必要です)

  3. フィールドに値(ネットマスクなど)が含まれていない場合、誤った[]をサニタイズ(削除)するにはどうすればよいですか。

XMLは、2つの出力(サニタイズ)のいずれかのように見えます。

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

探している出力が表示されますが、「builtins.IndexError:list index out of range」に注意して、6〜9個のエントリの後で停止しているようです。

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 に答える