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

<?xml version="1.0"?>
<VehicleInfo>
<FileHeader>
<ScaleInfo>
<SN>H00120030101081526</SN>
<UserName>盛隆钢铁</UserName>
<ScaleName>2#</ScaleName>
<ScaleID>H001</ScaleID>
<ScaleType>铁水秤开关</ScaleType>
<WeighingType>铁水秤开关</WeighingType>
<MeasureTime>2003-01-01 08:15:26</MeasureTime>
<NodeNumber>2</NodeNumber>
<WaveFile>20030101081424.wave</WaveFile>
<VideoFile>20030101081424.wave</VideoFile>
<Orientation>右方向来车&lt;&lt;&lt;&lt;&lt;&lt;</Orientation>
<OperatorName>Admin</OperatorName>
<SUMWeight>0</SUMWeight>
</ScaleInfo>
</FileHeader>
<FileBody>
<Node>
<ID>1</ID>
<_DateTime>2003-1-1 8:14:25</_DateTime>
<VehicleType />
<VehicleCardID />
<Speed>17.5</Speed>
<Weight>3.12</Weight>
<FrontAxisWeight>.00</FrontAxisWeight>
<BackAxisWeight>.00</BackAxisWeight>
<InsideWheel1>.00</InsideWheel1>
<OutsideWheel1>.00</OutsideWheel1>
<InsideWheel2>.00</InsideWheel2>
<OutsideWheel2>.00</OutsideWheel2>
<InsideWheel3>.00</InsideWheel3>
<OutsideWheel3>.00</OutsideWheel3>
<InsideWheel4>.00</InsideWheel4>
<OutsideWheel4>.00</OutsideWheel4>
<Temperature>0123</Temperature>
<Humidity>0123</Humidity>
<PIC1>_1.bmp</PIC1>
<PIC2>_2.bmp</PIC2>
<PIC3>_3.bmp</PIC3>
<PIC4>_4.bmp</PIC4>
</Node>
<Node>
<ID>2</ID>
<_DateTime>2003-1-1 8:14:26</_DateTime>
<VehicleType />
<VehicleCardID />
<Speed>15.8</Speed>
<Weight>4.77</Weight>
<FrontAxisWeight>.00</FrontAxisWeight>
<BackAxisWeight>.00</BackAxisWeight>
<InsideWheel1>.00</InsideWheel1>
<OutsideWheel1>.00</OutsideWheel1>
<InsideWheel2>.00</InsideWheel2>
<OutsideWheel2>.00</OutsideWheel2>
<InsideWheel3>.00</InsideWheel3>
<OutsideWheel3>.00</OutsideWheel3>
<InsideWheel4>.00</InsideWheel4>
<OutsideWheel4>.00</OutsideWheel4>
<Temperature>0123</Temperature>
<Humidity>0123</Humidity>
<PIC1>_1.bmp</PIC1>
<PIC2>_2.bmp</PIC2>
<PIC3>_3.bmp</PIC3>
<PIC4>_4.bmp</PIC4>
</Node>
</FileBody>
</VehicleInfo>

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

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'liulixiang' from bs4 import BeautifulSoup
import glob left, left_times, left_weight = 0, 0, 0.0
right, right_times, right_weight = 0, 0, 0.0
files = sorted(glob.glob(r'E:\工作\work-documents\2013凤矿计量系统\Debug\WY.WeightBridge.Data\*.xml'))
for index, filename in enumerate(files, 1):
file = open(filename, encoding='utf-8').read()
soup = BeautifulSoup(file, 'xml')
print(index, '时间', soup.MeasureTime.string, '节数:', int(soup.NodeNumber.string), '方向:', soup.Orientation.string)
for node in soup.FileBody.findChildren('Node'):
print('\t序号:', node.ID.string, '重量:', node.Weight.string)
if soup.Orientation.string == '左方向来车>>>>>>':
left_weight += float(node.Weight.string)
elif soup.Orientation.string == '右方向来车<<<<<<':
right_weight += float(node.Weight.string)
if soup.Orientation.string == '左方向来车>>>>>>':
left += int(soup.NodeNumber.string)
left_times += 1
elif soup.Orientation.string == '右方向来车<<<<<<':
right += int(soup.NodeNumber.string)
right_times += 1
print('\n') print('左方向来车共{}次,共{}节,总皮重{:.2f}'.format(left_times, left, left_weight))
print('右方向来车共{}次,共{}节, 总毛重{:.2f}'.format(right_times, right, right_weight))
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. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  2. hbase0.96 put流程 源码分析

    无意间多瞄了一眼hbase0.98的代码,想复习下put流程.发现htable里面已经找不到processBatchOfPuts()奇怪了.看了半天原来变化还真大事实上0.96就没这个了,于是又搞了个 ...

  3. poj1637Sightseeing tour(混合图欧拉回路)

    题目请戳这里 题目大意:求混合图欧拉回路. 题目分析:最大流.竟然用网络流求混合图的欧拉回路,涨姿势了啊啊.. 其实仔细一想也是那么回事.欧拉回路是遍历所有边一次又回到起点的回路.双向图只要每个点度数 ...

  4. JAVA中正則表達式总结

    昨天,我的朋友请教我正則表達式.我也好久没有写过正則表達式了,昨天刚好看了下如鹏网创始人杨中科老师关于正則表達式的解说.使我加深了正則表達式的印像.现我把他总结下: 很多语言,包含Perl.PHP.P ...

  5. css版hover现边框

    需要注意的是  hover中要给盒子加:position:relative; <style type="text/css"> *{margin:0;padding:0; ...

  6. 经典mssql语句大全

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  7. oracle 计算两个时间之间的月份差,相差几个星期,相差多少天

    相差多少天:   sysdate-to_date('1991-01-01','YYYY-MM-DD'))<7 and (sysdate-to_date('1991=01=01','YYYY-MM ...

  8. 使2个div 在一行上显示

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  9. HDU1171-Big Event in HDU

    描述: Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don ...

  10. RAC ORA-12170 ora-12535/tns-12535

    现象:开发人员抱怨RAC数据库出现了时连得上时连不上的情况,用SQLPLUS一试,果然有这样的情况: SQL> conn system/*******@bjyd 已连接. SQL> con ...