免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7922 | 回复: 1
打印 上一主题 下一主题

python实现分割xml文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2019-03-08 17:14 |只看该作者 |倒序浏览
5可用积分
xml文件a.xml,但是格式不规范,<managedObject></managedObject>  或者 <managedObject .../> 两种格式  有的里面没有子元素

a.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE raml SYSTEM 'raml20.dtd'>
<raml version="2.0" xmlns="raml20.xsd">
  <cmData type="actual">
    <header>
      <log dateTime="2019-02-27T17:28:38" action="created" appInfo="ActualExporter">InternalValues are used</log>
    </header>
    <managedObject class="MRBTS" version="SBTS17A_1707_001" distName="PLMN-PLMN/MRBTS-804874" id="2048554">
      <p name="name">WZWL20</p>
      <p name="btsName">WZW0020</p>
    </managedObject>
    <managedObject class="MRBTS" version="SBTS17A_1707_001" distName="PLMN-PLMN/MRBTS-805575" id="2056406">
      <p name="name">WZWL129</p>
      <p name="btsName">WZW0129</p>
    </managedObject>
    <managedObject class="MRBTS" version="SBTS17A_1707_001" distName="PLMN-PLMN/MRBTS-808996" id="1910785">
      <p name="name">WZWL147</p>
      <p name="btsName">WZW0147</p>
    </managedObject>
    <managedObject class="VLANIF" version="SBTS16.10" distName="PLMN-PLMN/MRBTS-804874/TNL-1/ETHSVC-1/ETHIF-1/VLANIF-1" id="1018535">
      <p name="vlanId">3002</p>
    </managedObject>
    <managedObject class="VLANIF" version="SBTS16.10" distName="PLMN-PLMN/MRBTS-805575/TNL-1/ETHSVC-1/ETHIF-1/VLANIF-2" id="1018536">
      <p name="vlanId">902</p>
    </managedObject>
    <managedObject class="VLANIF" version="SBTS16.10" distName="PLMN-PLMN/MRBTS-808996/TNL-1/ETHSVC-1/ETHIF-1/VLANIF-3" id="1018537">
      <p name="vlanId">2000</p>
    </managedObject>
    <managedObject class="EQM" version="EQM17A_1708_008" distName="PLMN-PLMN/MRBTS-804874/EQM-1" id="2093977"/>
    <managedObject class="TNLSVC" version="TNL17A_1708_008" distName="PLMN-PLMN/MRBTS-805575/TNLSVC-1" id="2093000"/>
    <managedObject class="EQM_R" version="EQMR17A_1708_008" distName="PLMN-PLMN/MRBTS-808996/EQM_R-1" id="2092995"/>
  </cmData>
</raml>


这里想实现------将xml文件分割成若干小文件,以distname区分, 类似的MRBTS-804874分割到一个文件中, 比如PLMN-PLMN/MRBTS-804874 以及 PLMN-PLMN/MRBTS-804874/EQM-1这样的输出到一个文件,用PLMN-PLMN/MRBTS-804874命名
请教诸位大神,如何在linux 用python脚本实现,小白一枚 先谢过诸位了  想输出的效果如下:

MRBTS-804874.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE raml SYSTEM 'raml20.dtd'>
<raml version="2.0" xmlns="raml20.xsd">
  <cmData type="actual">
    <header>
      <log dateTime="2019-02-27T17:28:38" action="created" appInfo="ActualExporter">InternalValues are used</log>
    </header>
    <managedObject class="MRBTS" version="SBTS17A_1707_001" distName="PLMN-PLMN/MRBTS-804874" id="2048554">
      <p name="name">WZWL20</p>
      <p name="btsName">WZW0020</p>
    </managedObject>    <managedObject class="VLANIF" version="SBTS16.10" distName="PLMN-PLMN/MRBTS-804874/TNL-1/ETHSVC-1/ETHIF-1/VLANIF-1" id="1018535">
      <p name="vlanId">3002</p>
    </managedObject>
    <managedObject class="EQM" version="EQM17A_1708_008" distName="PLMN-PLMN/MRBTS-804874/EQM-1" id="2093977"/>
  </cmData>
</raml>






MRBTS-805575.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE raml SYSTEM 'raml20.dtd'>
<raml version="2.0" xmlns="raml20.xsd">
  <cmData type="actual">
    <header>
      <log dateTime="2019-02-27T17:28:38" action="created" appInfo="ActualExporter">InternalValues are used</log>
    </header>
    <managedObject class="MRBTS" version="SBTS17A_1707_001" distName="PLMN-PLMN/MRBTS-805575" id="2048554">
      <p name="name">WZWL20</p>
      <p name="btsName">WZW0020</p>
    </managedObject>    <managedObject class="VLANIF" version="SBTS16.10" distName="PLMN-PLMN/MRBTS-805575/TNL-1/ETHSVC-1/ETHIF-1/VLANIF-1" id="1018535">
      <p name="vlanId">3002</p>
    </managedObject>
    <managedObject class="EQM" version="EQM17A_1708_008" distName="PLMN-PLMN/MRBTS-805575/EQM-1" id="2093977"/>
  </cmData>
</raml>







MRBTS-808996.xml
........

论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
2 [报告]
发表于 2019-05-21 16:12 |只看该作者
顺便学了一下lxml
  1. from lxml import etree

  2. file = "a.xml"
  3. tree = etree.parse(file)
  4. root = tree.getroot()
  5. cmData = root[0]

  6. managedObjects=cmData.findall("{raml20.xsd}managedObject")   #原始所有managedObject元素
  7. distName= {ele.attrib['distName'].split("/")[1].split("-")[1] for ele in managedObjects}

  8. for dist in distName:
  9.     for ele in cmData.findall("{raml20.xsd}managedObject"): #清当前cmData所有元素
  10.         cmData.remove(ele)
  11.     for i in managedObjects:
  12.         if i.attrib['distName'].split("/")[1].split("-")[1] == dist:
  13.             cmData.append(i)                               #追加对应的元素
  14.     tree.write("MRBTS-{}.xml".format(dist),encoding="UTF-8",xml_declaration=True,pretty_print=True)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP