解析XML数据文件导致json或dict

时间:2018-04-20 02:58:09

标签: python json xml

我有数据,额外信息的最佳方式是什么: 下面是pesudo代码。 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&gt; show&gt; ip&gt; mroute&gt; TABLE_vrf&gt; ROW_vrf&gt; TABLE_one_route&gt; 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)

提取信息的最佳方式是什么?感谢您的所有意见。

2 个答案:

答案 0 :(得分:1)

以下任何一项都无法正确打开您的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()
  

需要解析以下内容:   nf:data&gt;显示&gt; ip&gt; mroute&gt; TABLE_vrf&gt; ROW_vrf&gt; TABLE_one_route&gt; ROW_one_route oif-name

输出:

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

答案 1 :(得分:0)

您可以考虑使用lxml objectify。它是python的一个模块,它允许您处理xml文件,就好像它们是普通的python对象层次结构一样。请查看@ http://lxml.de/objectify.html