有200多个XML文档,每个文档类似如下:

  1. <?xml version="1.0"?>
  2. <VehicleInfo>
  3. <FileHeader>
  4. <ScaleInfo>
  5. <SN>H00120030101081526</SN>
  6. <UserName>盛隆钢铁</UserName>
  7. <ScaleName>2#</ScaleName>
  8. <ScaleID>H001</ScaleID>
  9. <ScaleType>铁水秤开关</ScaleType>
  10. <WeighingType>铁水秤开关</WeighingType>
  11. <MeasureTime>2003-01-01 08:15:26</MeasureTime>
  12. <NodeNumber>2</NodeNumber>
  13. <WaveFile>20030101081424.wave</WaveFile>
  14. <VideoFile>20030101081424.wave</VideoFile>
  15. <Orientation>右方向来车&lt;&lt;&lt;&lt;&lt;&lt;</Orientation>
  16. <OperatorName>Admin</OperatorName>
  17. <SUMWeight>0</SUMWeight>
  18. </ScaleInfo>
  19. </FileHeader>
  20. <FileBody>
  21. <Node>
  22. <ID>1</ID>
  23. <_DateTime>2003-1-1 8:14:25</_DateTime>
  24. <VehicleType />
  25. <VehicleCardID />
  26. <Speed>17.5</Speed>
  27. <Weight>3.12</Weight>
  28. <FrontAxisWeight>.00</FrontAxisWeight>
  29. <BackAxisWeight>.00</BackAxisWeight>
  30. <InsideWheel1>.00</InsideWheel1>
  31. <OutsideWheel1>.00</OutsideWheel1>
  32. <InsideWheel2>.00</InsideWheel2>
  33. <OutsideWheel2>.00</OutsideWheel2>
  34. <InsideWheel3>.00</InsideWheel3>
  35. <OutsideWheel3>.00</OutsideWheel3>
  36. <InsideWheel4>.00</InsideWheel4>
  37. <OutsideWheel4>.00</OutsideWheel4>
  38. <Temperature>0123</Temperature>
  39. <Humidity>0123</Humidity>
  40. <PIC1>_1.bmp</PIC1>
  41. <PIC2>_2.bmp</PIC2>
  42. <PIC3>_3.bmp</PIC3>
  43. <PIC4>_4.bmp</PIC4>
  44. </Node>
  45. <Node>
  46. <ID>2</ID>
  47. <_DateTime>2003-1-1 8:14:26</_DateTime>
  48. <VehicleType />
  49. <VehicleCardID />
  50. <Speed>15.8</Speed>
  51. <Weight>4.77</Weight>
  52. <FrontAxisWeight>.00</FrontAxisWeight>
  53. <BackAxisWeight>.00</BackAxisWeight>
  54. <InsideWheel1>.00</InsideWheel1>
  55. <OutsideWheel1>.00</OutsideWheel1>
  56. <InsideWheel2>.00</InsideWheel2>
  57. <OutsideWheel2>.00</OutsideWheel2>
  58. <InsideWheel3>.00</InsideWheel3>
  59. <OutsideWheel3>.00</OutsideWheel3>
  60. <InsideWheel4>.00</InsideWheel4>
  61. <OutsideWheel4>.00</OutsideWheel4>
  62. <Temperature>0123</Temperature>
  63. <Humidity>0123</Humidity>
  64. <PIC1>_1.bmp</PIC1>
  65. <PIC2>_2.bmp</PIC2>
  66. <PIC3>_3.bmp</PIC3>
  67. <PIC4>_4.bmp</PIC4>
  68. </Node>
  69. </FileBody>
  70. </VehicleInfo>

现在要提取MeasureTime、NodeNumber、Orientation以及每个Node下面的Weight,最后计算左方向和右方向总次数和总节数,以及每个方向的总重与差。如果使用C#,代码不知道要多长,那就用Python吧~

  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. __author__ = 'liulixiang'
  4.  
  5. from bs4 import BeautifulSoup
  6. import glob
  7.  
  8. left, left_times, left_weight = 0, 0, 0.0
  9. right, right_times, right_weight = 0, 0, 0.0
  10. files = sorted(glob.glob(r'E:\工作\work-documents\2013凤矿计量系统\Debug\WY.WeightBridge.Data\*.xml'))
  11. for index, filename in enumerate(files, 1):
  12. file = open(filename, encoding='utf-8').read()
  13. soup = BeautifulSoup(file, 'xml')
  14. print(index, '时间', soup.MeasureTime.string, '节数:', int(soup.NodeNumber.string), '方向:', soup.Orientation.string)
  15. for node in soup.FileBody.findChildren('Node'):
  16. print('\t序号:', node.ID.string, '重量:', node.Weight.string)
  17. if soup.Orientation.string == '左方向来车>>>>>>':
  18. left_weight += float(node.Weight.string)
  19. elif soup.Orientation.string == '右方向来车<<<<<<':
  20. right_weight += float(node.Weight.string)
  21. if soup.Orientation.string == '左方向来车>>>>>>':
  22. left += int(soup.NodeNumber.string)
  23. left_times += 1
  24. elif soup.Orientation.string == '右方向来车<<<<<<':
  25. right += int(soup.NodeNumber.string)
  26. right_times += 1
  27. print('\n')
  28.  
  29. print('左方向来车共{}次,共{}节,总皮重{:.2f}'.format(left_times, left, left_weight))
  30. print('右方向来车共{}次,共{}节, 总毛重{:.2f}'.format(right_times, right, right_weight))
  31. print('总净重:%.2f' % (right_weight - left_weight))

注意:

1、soup = BeautifulSoup(file, 'xml'),因为BeautifulSoup默认解析HTML,所以解析XML时需要声明。

2、BS解析XML依赖lxml,windows下可以到这里下载二进制版本的lxml库。

3、BS的children()返回的是NavigableString,用findChildren可以返回tag。

这世上诱惑(五花八门的编程语言)太多,请抵制诱惑,今天这个语言流行(go说你呢)用这个,明天那个语言流行就用那个。人应该驾驭语言,而非语言来驾驭人。自勉!

使用BeautifulSoup解析XML文档的更多相关文章

  1. python优秀库 - 使用xmltodict解析xml文档

    上次讲到如何使用BeautifulSoup解析XML文档,今天发现另外一个python库xmltodict(https://github.com/martinblech/xmltodict)也很简单. ...

  2. 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目

    小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...

  3. 使用dom4j解析XML文档

    dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...

  4. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  5. java解析xml文档(dom)

    DOM解析XML文档 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件 ...

  6. java 解析XML文档

    Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...

  7. DOM生成XML文档与解析XML文档(JUNIT测试)

    package cn.liuning.test; import java.io.File; import java.io.IOException; import javax.xml.parsers.D ...

  8. [置顶] stax解析xml文档的6种方式

    原文链接:http://blog.csdn.net/u011593278/article/details/9745271 stax解析xml文档的方式: 基于光标的查询: 基于迭代模型的查找: 基于过 ...

  9. Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)

    使用GDataXML解析XML文档 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高.使用上更方便 这里主要介绍一下 ...

随机推荐

  1. php执行shell更新svn文件的方法

    vim /etc/sudoers 修改内容如下: #Defaults !visiblepw Defaults visiblepw #Defaults requiretty <?php set_t ...

  2. speex 回声消除的用法

    speex 回声消除的用法 分类: speex AEC 回声消除 2012-11-13 11:24 1336人阅读 评论(0) 收藏 举报 speex的回声消息 就是speex_echo_cancel ...

  3. 2015 11 26 java 配置环境变量

    使用java软件, 须进行改变配置环境变量.需要2步. 第一,在电脑中找到配置环境变量的位置: 我的电脑,属性,高级,环境变量. 第二,进行添加两个变量,更改一个变量: 1,变量名:JAVA_HOME ...

  4. Android学习路线(二十)运用Fragment构建动态UI

    要在Android系统上创建一个动态或者多面板的用户界面,你须要将UI组件以及activity行为封装成模块.让它可以在你的activity中灵活地切换显示与隐藏. 你可以使用Fragment类来创建 ...

  5. js小写转实现资本,js数字革命万元

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html>  <hea ...

  6. 一些ASP.NET的小知识点

    DataFormatString="{0:格式字符串}" 我们知道在DataFormatString 中的 {0}表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的格式; ...

  7. asp.net 连接access数据库方法

    在 Web.Config 中配置 Access 数据库驱动和数据库文件名称. 请看代码 <appSettings> <add key="DBDriver" val ...

  8. Dojo实现Tabs页报错(一)

    1.在用Dojo写tab页的过程中出现了一些错误 dojo源码如下: <%-- Document : grid Created on : 2013-12-15, 18:05:47 Author ...

  9. mysql 多重游标嵌套

    1.DECLARE CONTINUE HANDLER FOR NOT FOUND 在mysql的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND ...

  10. (转)C++中extern “C”含义深层探索

    (转)C++中extern “C”含义深层探索 转自: http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html 1.引言 C++语 ...