Java解析XML格式数据的方法详解
最初,XML语言仅仅是意图用来作为HTML语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容存储和表现分离等等优势注定了该语言从诞生之日起就会走向辉煌。XML语言在成为W3C标准之后进入到了一个快速发展的时期,当然它本身所具有的一系列优点和优势也注定了各大技术厂商对它的偏爱,Java作为软件行业的一种开发技术也迅速作出了反应,出现了多种对XML支持的工具,本文将会从这个角度对Java处理XML的几种主流技术进行介绍,希望能对您有所帮助。
Java有哪些优秀的类库及工具便于程序员对XML进行处理?
XML三种解析方式简介
大名鼎鼎的DOM
说它大名鼎鼎可是一点不为过,DOM是W3C处理XML的标准API,它是许多其它与XML处理相关的标准的基础,不仅是Java,其它诸如Javascript,PHP,MS.NET等等语言都实现了该标准,成为了应用最为广泛的XML处理方式。当然,为了能提供更多更加强大的功能,Java对于DOM直接扩展工具类有很多,比如很多Java程序员耳熟能详的JDOM,DOM4J等等,它们基本上属于对DOM接口功能的扩充,保留了很多DOMAPI的特性,许多原本的DOM程序员甚至都没有任何障碍就熟练掌握了另外两者的使用,直观、易于操作的方式使它深受广大Java程序员的喜爱。
绿色环保的SAX
SAX的应运而生有它特殊的需要,为什么说它绿色环保呢,这是因为SAX使用了最少的系统资源和最快速的解析方式对XML处理提供了支持。但随之而来繁琐的查找方式也给广大程序员带来许多困扰,常常令人头痛不已,同时它对XPath查询功能的支持,令人们对它又爱又恨。
默默无闻的Digester:XML的JavaBean化
Digester是apache基金组织下的一个开源项目,笔者对它的了解源于对Struts框架的研究,是否有很多程序员想要一解各大开源框架的设计甚至想要自己写一个功能强大的框架时会碰到这样一个难题:这些形形色色的用XML语言标记的框架配置文件,框架底层是用什么技术来解析呢?DOM解析耗费时间,SAX解析又过于繁琐,况且每次解析系统开销也会过大,于是,大家想到需要用与XML结构相对应的JavaBean来装载这些信息,由此Digester应运而生。它的出现为XML转换为JavaBean对象的需求带来了方便的操作接口,使得更多的类似需求得到了比较完美的解决方法,不再需要程序员自己实现此类繁琐的解析程序了。与此同时SUN也推出了XML和JavaBean转换工具类JAXB,有兴趣的读者可以自行了解。
下面来看一个Javadom解析XML的例子:
importjava.io.*; importorg.w3c.dom.*; importorg.xml.sax.SAXException; importjavax.xml.parsers.*; publicclassXml{ publicstaticvoidmain(String[]args){ DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); try{ DocumentBuilderbuilder=factory.newDocumentBuilder(); Documentdoc=builder.parse(newFile("E:\\work\\test\\xml1.xml")); NodeListnl=doc.getElementsByTagName("book"); for(inti=0;i<nl.getLength();i++){ System.out.println(nl.item(i).getAttributes().item(0)); System.out.println(doc.getElementsByTagName("title").item(i) .getFirstChild().getNodeValue()); System.out.println(doc.getElementsByTagName("title").item(i) .getAttributes().item(0)); System.out.println(doc.getElementsByTagName("author").item(i) .getFirstChild().getNodeValue()); System.out.println(doc.getElementsByTagName("year").item(i) .getFirstChild().getNodeValue()); System.out.println(doc.getElementsByTagName("price").item(i) .getFirstChild().getNodeValue()); System.out.println(); } }catch(ParserConfigurationExceptione){ e.printStackTrace(); }catch(SAXExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } }
xml:
<bookstore> <bookcategory="COOKING"> <titlelang="en">EverydayItalian</title> <author>GiadaDeLaurentiis</author> <year>2005</year> <price>30.00</price> </book> <bookcategory="CHILDREN"> <titlelang="en">HarryPotter</title> <author>JK.Rowling</author> <year>2005</year> <price>29.99</price> </book> <bookcategory="WEB"> <titlelang="en">LearningXML</title> <author>ErikT.Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
结果:
category="COOKING" EverydayItalian lang="en" GiadaDeLaurentiis 2005 30.00 category="CHILDREN" HarryPotter lang="en" JK.Rowling 2005 29.99 category="WEB" LearningXML lang="en" ErikT.Ray 2003 39.95