python - 如何使用 python 从 XML 文件中仅解析和获取所需的 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>
<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 之类的变量中的<vlan-name>
and<vlan-l3-interface-address>
标记,其格式为:
{'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,而不是给我每个元素的不同 dicts。
输出:
[{'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,而每次迭代都需要一个新的。所以,你需要放在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)
推荐阅读
- syntax - 使用分号语法了解评估和执行顺序
- python - 无法卸载numpy,
- python - 从列表中查找两次尝试中一个元素出现的最大总和
- php - 将数组重新排序为多维数组
- r - opencpu 不显示已安装的软件包
- c# - 从给定的日期字符串中提取 DateTime 格式
- php - 带有 PHP 会话变量的意外 T_STRING
- python - 如何通过更改 ONE 运算符来更改我的程序以将列表排序为降序?
- c# - 如何将 Web 服务中使用的 Bitmap 类转换为 C# 应用程序中的 System.Drawing.Bitmap?
- javascript - 如何返回使用 Google Sheets API spreadsheets.values.get 读取的值?