如何使用python从XML文件中仅解析和获取所需的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>
<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'}]