ホーム>source

次のようなXMLファイルがあります。

<rpc-reply xmlns:junos="http://xml.juniper.net/junos/15.1R5/junos">
    <vlan-information xmlns="http://xml.juniper.net/junos/15.1R5/junos-esw" junos:style="brief">
        <vlan-terse/>
        <vlan>
            <vlan-instance>0</vlan-instance>
            <vlan-name>ACRS-Dev2</vlan-name>
            <vlan-create-time>Fri Jan  1 00:37:59 2010
            </vlan-create-time>
            <vlan-status>Enabled</vlan-status>
            <vlan-owner>static</vlan-owner>
            <vlan-tag>0</vlan-tag>
            <vlan-index>2</vlan-index>
            <vlan-l3-interface>vlan.15 (UP)</vlan-l3-interface>
            <vlan-l3-interface-address>10.8.25.1/24</vlan-l3-interface-address>
            <vlan-protocol-port>Port Mode</vlan-protocol-port>
            <vlan-members-count>7</vlan-members-count>
            <vlan-members-upcount>6</vlan-members-upcount>
        </vlan>
        <vlan>
            <vlan-instance>0</vlan-instance>
            <vlan-name>default</vlan-name>
            <vlan-create-time>Fri Jan  1 00:37:59 2010
            </vlan-create-time>
            <vlan-status>Enabled</vlan-status>
            <vlan-owner>static</vlan-owner>
            <vlan-tag>0</vlan-tag>
            <vlan-index>3</vlan-index>
            <vlan-l3-interface>vlan.11 (UP)</vlan-l3-interface>
            <vlan-l3-interface-address>10.8.27.1/24</vlan-l3-interface-address>
            <vlan-protocol-port>Port Mode</vlan-protocol-port>
            <vlan-members-count>12</vlan-members-count>
            <vlan-members-upcount>2</vlan-members-upcount>
        </vlan>
    </vlan-information>
</rpc-reply>

これから、 <vlan-name> だけが欲しい  および <vlan-l3-interface-address>  構文解析され、dict/jsonのような変数に保存されるタグの形式は次のとおりです。

{'Vlan-Name' : vlan_name, 'Interface-Address' : interface_addr}

そして、dicts/jsonのリストの各要素にこれらのdict/jsonを追加します。 これはリスト内のjsonの解析と挿入のための私のコードです:

root = tree.getroot()
nw_pool = []
nw_json = {}
for child in root:
    for items in child:
        for item1 in items:
            if 'vlan-l3-interface-address' in item1.tag:
                interface_addr = item1.text
                nw_json['Interface-Address'] = interface_addr
            elif 'vlan-name' in item1.tag:
                vlan_name = item1.text
                nw_json['Vlan-Name'] = vlan_name
                nw_pool.append(nw_json)
print(nw_pool)

しかし、 nw_pool を印刷すると 、各要素に個別の辞書を提供する代わりに、最後に見つかった要素のjsonが繰り返される出力を提供します。

出力:

[{'Vlan-Name': 'default', 'Interface-Address': '10.8.27.1/24'}, {'Vlan-Name': 'default', 'Interface-Address': '10.8.27.1/24'}]

私が望む出力は次のとおりです。

[{'Vlan-Name': 'ACRS-Dev2', 'Interface-Address': '10.8.25.1/24'}, {'Vlan-Name': 'default', 'Interface-Address': '10.8.27.1/24'}]

誰かがこれで私を助けることができますか?前もって感謝します。

あなたの答え
  • 解決した方法 # 1

    既存の辞書を上書きしますが、繰り返しごとに新しい辞書が必要です。だから、あなたは nw_json = {} を置く必要があります  別の場所で:

    root = tree.getroot()
    nw_pool = []
    for child in root:
        for items in child:
            nw_json = {}   # Work with new dict
            for item1 in items:
                if 'vlan-l3-interface-address' in item1.tag:
                    interface_addr = item1.text
                    nw_json['Interface-Address'] = interface_addr
                elif 'vlan-name' in item1.tag:
                    vlan_name = item1.text
                    nw_json['Vlan-Name'] = vlan_name
                    nw_pool.append(nw_json)
    print(nw_pool)
    
    

  • 解決した方法 # 2

    コードの問題は、ループの前にdict()オブジェクトを開始したため、フローでデータが上書きされていることです。

    @Hoenieの答えは、あなたの間違いについて明確にする。

    それに加えて、XMLの構文解析にはBeautifulSoupを試してみることをお勧めします。XMLは単純で理解しやすいからです。以下のコードを試してください。

    from bs4 import BeautifulSoup
    fileObj = open('test.xml').read()
    soup = BeautifulSoup(fileObj, 'lxml')
    vlans = soup.findAll('vlan')
    nw_pool = []
    for vlan in vlans:
        nw_json = dict()
        nw_json['Interface-Address'] = vlan.find('vlan-l3-interface-address').text
        nw_json['Vlan-Names'] = vlan.find('vlan-name').text
        nw_pool.append(nw_json)
    print(nw_pool) # O/P [{'Interface-Address': '10.8.25.1/24', 'Vlan-Names': 'ACRS-Dev2'}, {'Interface-Address': '10.8.27.1/24', 'Vlan-Names': 'default'}]
    
    

    乾杯!

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ webhooks - MSチームメッセージカードのテーブルにデータを追加する