如何使用python从XML文件中仅解析和获取所需的XML元素?

如何使用python从XML文件中仅解析和获取所需的XML元素?,python,json,xml,Python,Json,Xml,我有一个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>

我有一个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>
然后为dict/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,而不是为每个元素提供不同的dict

输出:

[{'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'}] 

有人能帮我吗?提前感谢。

您正在覆盖现有的dict,而每次迭代都需要一个新的dict。因此,您需要将
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)

代码中的问题是在循环之前启动了dict()对象,因此数据在流中被覆盖

澄清你的错误

除此之外,我建议您尝试使用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'}]

干杯

我对你的解决方案的简单而准确感到惊讶,但我显然没有做到,先生。谢谢你的时间和帮助。接受你的回答并+1。我的荣幸,快乐!我很感谢你的帮助,先生。我不使用BeautifulSoup的原因是它不在标准库中,并且在以后投入生产并部署到不同环境时可能会产生依赖性问题+1感谢您的帮助和解决方案:)
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'}]