用XmlReader解析xml文件不用提前将内容加载到内存,而是逐行读取,减少内存占用,其高效率,能够有效读取超大xml文件。废话少说,直接上代码!

xml文件格式样例:

<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="osmconvert 0.8.5"><bounds minlat="-41.98399" minlon="-73.89404" maxlat="-32.84267" maxlon="-70.92773"/><node id="13698430" lat="-34.2911861" lon="-71.3101819" version="2" timestamp="2010-11-27T14:02:18Z" changeset="6470051" uid="337684" user="felipeedwards"/><node id="13698430" lat="-34.2911941" lon="-71.3101193" version="3" timestamp="2010-12-13T00:22:55Z" changeset="6643617" uid="337684" user="felipeedwards"/><node id="50026147" lat="-33.0228196" lon="-71.5509851" version="3" timestamp="2008-03-16T03:48:24Z" changeset="330702" uid="30854" user="Zambelli Limitada"><tag k="name" v="Viña del Mar"/><tag k="is_in" v="Chile, Latin America"/><tag k="place" v="city"/><tag k="created_by" v="Potlatch 0.7b"/></node><node id="50026147" lat="-33.0244675" lon="-71.5515995" version="4" timestamp="2008-03-18T06:04:36Z" changeset="348809" uid="30854" user="Zambelli Limitada"><tag k="name" v="Viña del Mar"/><tag k="is_in" v="Chile, Latin America"/><tag k="place" v="city"/><tag k="created_by" v="Potlatch 0.7b"/></node><way id="23456524" version="1" timestamp="2008-03-26T02:18:52Z" changeset="397290" uid="30854" user="Zambelli Limitada"><nd ref="254026575"/><nd ref="254026576"/><nd ref="254026577"/><tag k="name" v="2 Oriente"/><tag k="oneway" v="yes"/><tag k="highway" v="residential"/><tag k="created_by" v="Potlatch 0.8"/></way><way id="23456524" version="2" timestamp="2008-03-26T02:19:09Z" changeset="397290" uid="30854" user="Zambelli Limitada"><nd ref="254026580"/><nd ref="254026581"/><nd ref="254026575"/><nd ref="254026576"/><nd ref="254026577"/><tag k="name" v="2 Oriente"/><tag k="oneway" v="yes"/><tag k="highway" v="residential"/><tag k="created_by" v="Potlatch 0.8"/></way>   <relation id="4296616" version="1" timestamp="2014-12-21T20:14:43Z" changeset="27617220" uid="695793" user="quadero"><member type="way" ref="304321808" role="outer"/><member type="way" ref="304279235" role="outer"/><member type="way" ref="304279236" role="outer"/><tag k="name" v="Universidad de La Frontera"/><tag k="type" v="multipolygon"/><tag k="amenity" v="university"/><tag k="addr:city" v="Temuco"/><tag k="addr:street" v="Francisco Salazar"/><tag k="addr:housenumber" v="01145"/></relation><relation id="4296667" version="1" timestamp="2014-12-21T20:25:40Z" changeset="27617430" uid="695793" user="quadero"><member type="way" ref="307633498" role="outer"/><member type="way" ref="307633497" role="outer"/><member type="way" ref="307633496" role="outer"/><tag k="type" v="multipolygon"/><tag k="amenity" v="parking"/></relation>
</osm>

文件解析代码:

        public void XmlParse(XmlReader source){string pointOsmId ="";string pointLat = "";string pointLon = "";string pointVersion = "";string pointTimestamp = "";string pointChangeset = "";string pointUserid = "";string pointUsername = "";string wayOsmId = "";string wayVersion = "";string wayTimestamp = "";string wayChangeset = "";string wayUserid = "";string wayUsername = "";string reationOsmId = "";string reationVersion = "";string reationTimestamp = "";string reationChangeset = "";string reationUserid = "";string reationUsername = "";while (source.Read()){if (source.NodeType == XmlNodeType.Element &&source.Name == "node"){pointOsmId = source.GetAttribute("id");pointLat = source.GetAttribute("lat");pointLon = source.GetAttribute("lon");pointVersion = source.GetAttribute("version");pointTimestamp = source.GetAttribute("timestamp");pointChangeset = source.GetAttribute("changeset");pointUserid = source.GetAttribute("uid");pointUsername = source.GetAttribute("user");string content = source.ReadInnerXml();string tagFormated = string.Format("<tag>{0}</tag>", content);XElement element = XElement.Parse(tagFormated);int tagCount=element.Elements().Count();string tags = "";int count = tagCount;while (tagCount>0){tags += "key=" + element.Elements().ElementAt(count - tagCount).Attribute("k").Value + ",value=" + element.Elements().ElementAt(count - tagCount).Attribute("v").Value + ";";tagCount--;}Console.WriteLine("Node osmId:" + pointOsmId);Console.WriteLine("Node pointLat:" + pointLat);Console.WriteLine("Node pointLon:" + pointLon);Console.WriteLine("Node pointVersion:" + pointVersion);Console.WriteLine("Node pointTimestamp:" + pointTimestamp);Console.WriteLine("Node pointChangeset:" + pointChangeset);Console.WriteLine("Node pointUserid:" + pointUserid);Console.WriteLine("Node pointUsername:" + pointUsername);Console.WriteLine("Node tags:" + tags);}if (source.NodeType == XmlNodeType.Element && source.Name == "way"){wayOsmId = source.GetAttribute("id");wayVersion = source.GetAttribute("version");wayTimestamp = source.GetAttribute("timestamp");wayChangeset = source.GetAttribute("changeset");wayUserid = source.GetAttribute("uid");wayUsername = source.GetAttribute("user");string content = source.ReadInnerXml();string Formated = string.Format("<way>{0}</way>", content);XElement element = XElement.Parse(Formated);string pointsId = "";string tags = "";XmlReader r=element.CreateReader();while( r.Read()){if (r.NodeType == XmlNodeType.Element && r.Name == "nd"){pointsId += r.GetAttribute("ref").ToString() + ",";}else if (r.NodeType == XmlNodeType.Element && r.Name == "tag"){tags += "key=" + r.GetAttribute("k").ToString() + ",value=" + r.GetAttribute("v").ToString()+ ";";} }Console.WriteLine("Way osmId:" + wayOsmId);Console.WriteLine("Way pointVersion:" + wayVersion);Console.WriteLine("Way pointTimestamp:" + wayTimestamp);Console.WriteLine("Way pointChangeset:" + wayChangeset);Console.WriteLine("Way pointUserid:" + wayUserid);Console.WriteLine("Way pointUsername:" + wayUsername);Console.WriteLine("Way pointsId:" + pointsId);Console.WriteLine("Way tags:" + tags);}if (source.NodeType == XmlNodeType.Element && source.Name == "relation"){reationOsmId = source.GetAttribute("id");reationVersion = source.GetAttribute("version");reationTimestamp = source.GetAttribute("timestamp");reationChangeset = source.GetAttribute("changeset");reationUserid = source.GetAttribute("uid");reationUsername = source.GetAttribute("user");string content = source.ReadInnerXml();string Formated = string.Format("<relation>{0}</relation>", content);XElement element = XElement.Parse(Formated);string member = "";string tags = "";XmlReader r=element.CreateReader();while (r.Read()) {if (r.NodeType == XmlNodeType.Element && r.Name == "member"){member = r.GetAttribute("type").ToString() + "," + r.GetAttribute("ref").ToString() + "," + r.GetAttribute("role").ToString() + ";";}else if (r.NodeType == XmlNodeType.Element && r.Name == "tag"){tags += "key=" + r.GetAttribute("k").ToString() + ",value=" + r.GetAttribute("v").ToString() + ";";} }Console.WriteLine("relation osmId:" + reationOsmId);Console.WriteLine("relation pointVersion:" + reationVersion);Console.WriteLine("relation pointTimestamp:" + reationTimestamp);Console.WriteLine("relation pointChangeset:" + reationChangeset);Console.WriteLine("relation pointUserid:" + reationUserid);Console.WriteLine("relation pointUsername:" + reationUsername);Console.WriteLine("relation member:" + member);Console.WriteLine("relation tags:" + tags);}}}

输出结果:

Node osmId:13698430
Node pointLat:-34.2911861
Node pointLon:-71.3101819
Node pointVersion:2
Node pointTimestamp:2010-11-27T14:02:18Z
Node pointChangeset:6470051
Node pointUserid:337684
Node pointUsername:felipeedwards
Node tags:
Node osmId:13698430
Node pointLat:-34.2911941
Node pointLon:-71.3101193
Node pointVersion:3
Node pointTimestamp:2010-12-13T00:22:55Z
Node pointChangeset:6643617
Node pointUserid:337684
Node pointUsername:felipeedwards
Node tags:
Node osmId:50026147
Node pointLat:-33.0228196
Node pointLon:-71.5509851
Node pointVersion:3
Node pointTimestamp:2008-03-16T03:48:24Z
Node pointChangeset:330702
Node pointUserid:30854
Node pointUsername:Zambelli Limitada
Node tags:key=name,value=Vi?a del Mar;key=is_in,value=Chile, Latin America;key=place,value=city;key=created_by,value=Potlatch 0.7b;
Node osmId:50026147
Node pointLat:-33.0244675
Node pointLon:-71.5515995
Node pointVersion:4
Node pointTimestamp:2008-03-18T06:04:36Z
Node pointChangeset:348809
Node pointUserid:30854
Node pointUsername:Zambelli Limitada
Node tags:key=name,value=Vi?a del Mar;key=is_in,value=Chile, Latin America;key=place,value=city;key=created_by,value=Potlatch 0.7b;
Way osmId:23456524
Way pointVersion:1
Way pointTimestamp:2008-03-26T02:18:52Z
Way pointChangeset:397290
Way pointUserid:30854
Way pointUsername:Zambelli Limitada
Way pointsId:254026575,254026576,254026577,
Way tags:key=name,value=2 Oriente;key=oneway,value=yes;key=highway,value=residential;key=created_by,value=Potlatch 0.8;
Way osmId:23456524
Way pointVersion:2
Way pointTimestamp:2008-03-26T02:19:09Z
Way pointChangeset:397290
Way pointUserid:30854
Way pointUsername:Zambelli Limitada
Way pointsId:254026580,254026581,254026575,254026576,254026577,
Way tags:key=name,value=2 Oriente;key=oneway,value=yes;key=highway,value=residential;key=created_by,value=Potlatch 0.8;
relation osmId:4296616
relation pointVersion:1
relation pointTimestamp:2014-12-21T20:14:43Z
relation pointChangeset:27617220
relation pointUserid:695793
relation pointUsername:quadero
relation member:way,304279236,outer;
relation tags:key=name,value=Universidad de La Frontera;key=type,value=multipolygon;key=amenity,value=university;key=addr:city,value=Temuco;key=addr:street,value=Francisco Salazar;key=addr:housenumber,value=01145;
relation osmId:4296667
relation pointVersion:1
relation pointTimestamp:2014-12-21T20:25:40Z
relation pointChangeset:27617430
relation pointUserid:695793
relation pointUsername:quadero
relation member:way,307633496,outer;
relation tags:key=type,value=multipolygon;key=amenity,value=parking;

c#语言用XmlReader解析超大XML文件相关推荐

  1. xml的学习和使用python解析读取xml文件

    1. XML的介绍 XML 指可扩展标记语言(EXtensible Markup Language). 和json类似也是用于存储和传输数据,还可以用作配置文件. 类似于HTML超文本标记语言,但是H ...

  2. 解析超大JSON文件

    解析超大JSON文件 1.需求 最近项目中需要将一个一个大于50G的JSON文件导入到ES中,试过普通的按行读取文件和JSONReader流读取文件,由于json文件实在过于庞大,都不能解决问题. 2 ...

  3. PMS解析AndroidManifest.xml文件的过程

    一.前言 ​      前段时间在看当下主流的安卓插件化技术原理的时候,发现目前插件化技术对于四大组件的处理基本都是通过代理来实现的(动态注册的广播接收器除外).简单说就是需要先在主包里预埋一个注册在 ...

  4. dom4j解析RDF/XML文件

    dom4j解析RDF/XML文件 xml <?xml version="1.0" encoding="UTF-8" ?> <rdf:RDF x ...

  5. android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...

    转载请注明出处:http://blog.csdn.net/droyon/article/details/9346657 Sax解析xml 以下是测试Demo 运行程序类 public class Te ...

  6. 呀,要解析的xml文件有1G大,怎么办?

    上个月工作中,遇到了一个超大的xml文件解析工作.然后按照以往的方法jdom试了一下,然后jvm内存溢出了.没得办法,只有上网寻找万能的网友们了.花了接近一上午的时间终于写好了一个实用符合编码习惯的工 ...

  7. 用Python解析AndroidManifest.xml文件找MainActivity

    写在前面的话 这个是一篇水博客,因为我知道只要是个大二的小朋友就可以搞定,我大二就一天在搞这些事情,今天纯属吃饱了撑着,想敲键盘,等实验结果然后随便写写.我知道大家都会的,不会的小朋友随便看看然后自己 ...

  8. java解析xml文件失败,在Java中解析大型XML文件时找不到文件异常

    我使用SAX(Simple API for XML)来解析XML文档.该文档是一个巨大的XML文件(dblp.xml - 1.46 GB),我写了几行解析器并在小文件上测试它,它的工作原理. Samp ...

  9. 解析一个xml文件并将数据存入数据库

    解析xml文件并将文件存入数据库 一.使用dom4j对xml文件进行解析 1.首先要有一个xml文件 2.需求 3.创建Books实例类 4.开始解析xml文件 5.测试代码: 6.结果: 二.进行数 ...

最新文章

  1. 使用Cookie记录信息
  2. Dijkstra算法的思想和数学归纳法
  3. c++随机打乱数组_【洗牌算法】你确定这样的抽奖算法是随机的?
  4. 设计合理的实验方案来研究阳离子改性棉织物与未改性棉的染色动力学性能
  5. 想领取开发套件,就来参加AIoT开发者大赛
  6. 没有Science也没有娃,上海交大博士谈科研经历爆笑全场
  7. 几个查看进程及日志的命令
  8. 用LVM在VMware中的Linux硬盘扩容
  9. 在已有的服务器上如何部署网站,如何在云服务器上部署网站
  10. 《大数据技术原理与应用》林子雨 期末复习重点(总结)
  11. 01-【分析】神策系统的拆解与分析
  12. 强化学习——Q学习算法
  13. 新媒体渠道运营推广技巧
  14. 洛谷 P1564 膜拜
  15. C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)
  16. Navicat 15注册时报错“Rsa Public key not find“的解决办法
  17. ch.ethz.ganymed包ganymed-ssh2的使用
  18. 对SingleTask和TaskAffinity的理解
  19. mysql最高安全级别双一_MySQL调优参数
  20. java tcp 断开检测_TCP连接网线断开时的情况测试

热门文章

  1. TypeError: argument 1 has unexpected type 'NoneType'(解决办法)
  2. 15.线程同步的几种方法
  3. 幻方萤火 | 高速读写文件系统 3FS
  4. 59.Mongoose
  5. tomcat如何调优
  6. 游戏玩家的程序猿之路
  7. 自相关与互相关的理解与物理意义
  8. 华中科技大学计算机专业期末考试,华中科技大学计算机网络试题
  9. 解决tar 时间戳XXX是未来的XXX秒之后问题
  10. 洛谷P1966 火柴排队