python - 解析 XML 数据文件结果为 json 或 dict

标签 python json xml

我有数据,获取额外信息的最佳方式是什么: 下面是伪代码。 XML 数据:

<nf:data>
  <show>
   <ip>
    <mroute>
     <__XML__OPT_Cmd_mrib_show_mroute_command>
      <__XML__BLK_Cmd_mrib_show_mroute_command_source>
       <__XML__OPT_Cmd_mrib_show_mroute_command_source>
        <__XML__OPT_Cmd_mrib_show_mroute_command_group>
         <group>
          <__XML__PARAM_value>239.16.110.124</__XML__PARAM_value>
         </group>
        </__XML__OPT_Cmd_mrib_show_mroute_command_group>
       </__XML__OPT_Cmd_mrib_show_mroute_command_source>
      </__XML__BLK_Cmd_mrib_show_mroute_command_source>
      <__XML__OPT_Cmd_mrib_show_mroute_command_vrf>
       <__XML__OPT_Cmd_mrib_show_mroute_command___readonly__>
        <__readonly__>
         <TABLE_vrf>
          <ROW_vrf>
           <vrf-name>default</vrf-name>
           <route_count>10623</route_count>
           <star_g_cnt>4842</star_g_cnt>
           <sg_cnt>5780</sg_cnt>
           <star_g_prfx_cnt>1</star_g_prfx_cnt>
           <TABLE_one_route>
            <ROW_one_route>
             <mcast-addrs>(192.168.2.28/32, 239.16.110.124/32)</mcast-addrs>
             <pending>false</pending>
             <bidir>false</bidir>
             <uptime>3w6d</uptime>
             <mofrr>false</mofrr>
             <TABLE_mpib>
              <ROW_mpib>
               <mpib-name>pim</mpib-name>
               <oif-count>2</oif-count>
               <stale-route>false</stale-route>
              </ROW_mpib>
              <ROW_mpib>
               <mpib-name>ip</mpib-name>
               <oif-count>0</oif-count>
               <stale-route>false</stale-route>
              </ROW_mpib>
             </TABLE_mpib>
             <stats-pkts>625954</stats-pkts>
             <stats-bytes>31923654</stats-bytes>
             <stats-rate-buf>108.800 bps</stats-rate-buf>
             <route-iif>Ethernet2/1</route-iif>
             <rpf-nbr>192.168.1.251</rpf-nbr>
             <mofrr-iif>Null</mofrr-iif>
             <mofrr-nbr>0.0.0.0</mofrr-nbr>
             <internal>false</internal>
             <oif-count>2</oif-count>
             <fabric-oif>false</fabric-oif>
             <fabric-loser>false</fabric-loser>
             <TABLE_oif>
              <ROW_oif>
               <oif-name>Ethernet2/32</oif-name>
               <oif-uptime>3w6d</oif-uptime>
               <TABLE_oif_mpib>
                <ROW_oif_mpib>
                 <oif-mpib-name>pim</oif-mpib-name>
                 <stale-oif>false</stale-oif>
                 <omd-vpc-svi>false</omd-vpc-svi>
                </ROW_oif_mpib>
               </TABLE_oif_mpib>
               <rpf>false</rpf>
              </ROW_oif>
              <ROW_oif>
               <oif-name>Ethernet1/32</oif-name>
               <oif-uptime>3w6d</oif-uptime>
               <TABLE_oif_mpib>
                <ROW_oif_mpib>
                 <oif-mpib-name>pim</oif-mpib-name>
                 <stale-oif>false</stale-oif>
                 <omd-vpc-svi>false</omd-vpc-svi>
                </ROW_oif_mpib>
               </TABLE_oif_mpib>
               <rpf>false</rpf>
              </ROW_oif>
             </TABLE_oif>
            </ROW_one_route>
           </TABLE_one_route>
          </ROW_vrf>
         </TABLE_vrf>
        </__readonly__>
       </__XML__OPT_Cmd_mrib_show_mroute_command___readonly__>
      </__XML__OPT_Cmd_mrib_show_mroute_command_vrf>
     </__XML__OPT_Cmd_mrib_show_mroute_command>
    </mroute>
   </ip>
  </show>
 </nf:data>
</nf:rpc-reply>

需要解析以下内容: 1.登录交换机
2. 寻找线索: 3. 循环:(nf:data > show > ip > mroute > TABLE_vrf > ROW_vrf > TABLE_one_route > ROW_one_route) 4. 伪代码:

for loop ROW_one_route
if mcast-addrs startswith (*,)
  skip
if mcast-addrs startswith (\d)
parse following information: 
forloop TABLE_oif > ROW_oif
  statbps = stats-rate-buf
  statpkt = stats-pkts
  if oif-name startswith (vlan*) 
    skip
  if oif-name startstwith (eth)
    find oif-name
    outint.append(oif-name)

提取信息的最佳方法是什么?感谢您的所有投入。

最佳答案

以下任何一项都无法正确打开您的 xml 文件:

xml2dictElementTreeminidom

我继续使用我以前从未使用过的BeautifulSoup,令人惊讶的是,它有效!

fp = open('test.xml')

soup = BeautifulSoup(fp, 'xml')

items =  soup.find_all('oif-name')

for item in items:
    print item
    print item.get_text()

need to parse following: nf:data > show > ip > mroute > TABLE_vrf > ROW_vrf > TABLE_one_route > ROW_one_route oif-name

输出:

<oif-name>Ethernet2/32</oif-name>
Ethernet2/32
<oif-name>Ethernet1/32</oif-name>
Ethernet1/32

关于python - 解析 XML 数据文件结果为 json 或 dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49933233/

相关文章:

python - Python 中字典的替代品——需要通过命名键引用值并按插入顺序迭代

python - 额外学分 3,艰难地学习 Python 练习 17

java - 如果我们试图将 JSON 放入 hashmap 中,我们如何使用 jackson 处理 JSON 内部的 JSON?

ios - JSON 推文发布日期

ruby - 将 JSON 字符串 append 到 Ruby 中已包含 JSON 的文件

xml - 如何检查元素是否存在并选择元素值的子字符串

xml - Schematrion 不区分大小写 sqf :stringReplace

python - 为什么当我将 GridSearchCV 与 roc_auc 评分一起使用时,grid_search.score(X,y) 和 roc_auc_score(y, y_predict) 的分数不同?

python - Matplotlib 返回空图

c++ - 如何为 PerfPublisher 插件生成 xml dtd 报告以在 jenkins 上可视化?