java读取解析xml文件实例
读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵。
DOM解析的特性就是读取xml文件转换为dom树形结构,通过节点进行遍历。
这是W3c关于节点的概念
如果xml中包含有大量的数据,由于dom一次性把xml装入内存中的特性,所以dom不适合于包含大量数据的xml解析。当包含有大量xml的时候,用SAX进行解析比较节省内存。
下面是一个运用DOM进行解析xml文件的例子:
xml文件结构如下:
<?xmlversion="1.0"encoding="ISO-8859-1"?> <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">XQueryKickStart</title> <author>JamesMcGovern</author> <year>2003</year> <price>49.99</price> </book> <bookcategory="web"cover="paperback"> <titlelang="en">LearningXML</title> <author>ErikT.Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
创建解析xml的类如下:
packagexml.dom; importjava.io.File; importjavax.xml.parsers.DocumentBuilder; importjavax.xml.parsers.DocumentBuilderFactory; importorg.w3c.dom.Document; importorg.w3c.dom.Element; importorg.w3c.dom.Node; importorg.w3c.dom.NodeList; publicclassReadXmlFile{ publicstaticvoidmain(String[]args){ try{ FilexmlFile=newFile("src/resource/book.xml"); DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=builderFactory.newDocumentBuilder(); Documentdoc=builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("Rootelement:"+doc.getDocumentElement().getNodeName()); NodeListnList=doc.getElementsByTagName("book"); for(inti=0;i<nList.getLength();i++){ Nodenode=nList.item(i); System.out.println("Nodename:"+node.getNodeName()); Elementele=(Element)node; System.out.println("----------------------------"); if(node.getNodeType()==Element.ELEMENT_NODE){ System.out.println("bookcategory:"+ele.getAttribute("category")); System.out.println("titlename:"+ele.getElementsByTagName("title").item(0).getTextContent()); System.out.println("authorname:"+ele.getElementsByTagName("author").item(0).getTextContent()); System.out.println("year:"+ele.getElementsByTagName("year").item(0).getTextContent()); System.out.println("price:"+ele.getElementsByTagName("price").item(0).getTextContent()); System.out.println("-------------------------"); } }
解析结果:
Rootelement:bookstore Nodename:book ---------------------------- bookcategory:cooking titlename:EverydayItalian authorname:GiadaDeLaurentiis year:2005 price:30.00 ------------------------- Nodename:book ---------------------------- bookcategory:children titlename:HarryPotter authorname:JK.Rowling year:2005 price:29.99 ------------------------- Nodename:book ---------------------------- bookcategory:web titlename:XQueryKickStart authorname:JamesMcGovern year:2003 price:49.99 ------------------------- Nodename:book ---------------------------- bookcategory:web titlename:LearningXML authorname:ErikT.Ray year:2003 price:39.95 -------------------------
以上是通过name获得对应的值,
下面利用循环节点的方式输出:
循环节点输出方式的代码如下:
packagexml.dom; importjava.io.File; importjavax.xml.parsers.DocumentBuilder; importjavax.xml.parsers.DocumentBuilderFactory; importorg.w3c.dom.Document; importorg.w3c.dom.NamedNodeMap; importorg.w3c.dom.Node; importorg.w3c.dom.NodeList; publicclassReadXmlFile2{ publicstaticvoidmain(String[]args){ try{ FilexmlFile=newFile("src/resource/book.xml"); DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=builderFactory.newDocumentBuilder(); Documentdoc=builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("Rootelement:"+doc.getDocumentElement().getNodeName()); if(doc.hasChildNodes()){ printNode(doc.getChildNodes()); } }catch(Exceptione){ e.printStackTrace(); } } publicstaticvoidprintNode(NodeListnodeList){ System.out.println("------------------------"); //System.out.println(nodeList.getLength()); for(inti=0;i<nodeList.getLength();i++){ Nodenode=(Node)nodeList.item(i); if(node.getNodeType()==Node.ELEMENT_NODE){ System.out.println("nodename:"+node.getNodeName()); System.out.println("nodevalue:"+node.getTextContent()); if(node.hasAttributes()){ NamedNodeMapnodeMap=node.getAttributes(); for(intj=0;j<nodeMap.getLength();j++){ Nodenodenew=nodeMap.item(j); System.out.println("nodename"+nodenew.getNodeName()); System.out.println("nodevalue"+nodenew.getNodeValue()); } } if(node.hasChildNodes()){ printNode(node.getChildNodes()); } } } } }
输出结果如下:
Rootelement:bookstore ------------------------ nodename:bookstore nodevalue: EverydayItalian GiadaDeLaurentiis 2005 30.00 HarryPotter JK.Rowling 2005 29.99 XQueryKickStart JamesMcGovern 2003 49.99 LearningXML ErikT.Ray 2003 39.95 ------------------------ nodename:book nodevalue: EverydayItalian GiadaDeLaurentiis 2005 30.00 nodenamecategory nodevaluecooking ------------------------ nodename:title nodevalue:EverydayItalian nodenamelang nodevalueen ------------------------ nodename:author nodevalue:GiadaDeLaurentiis ------------------------ nodename:year nodevalue:2005 ------------------------ nodename:price nodevalue:30.00 ------------------------ nodename:book nodevalue: HarryPotter JK.Rowling 2005 29.99 nodenamecategory nodevaluechildren ------------------------ nodename:title nodevalue:HarryPotter nodenamelang nodevalueen ------------------------ nodename:author nodevalue:JK.Rowling ------------------------ nodename:year nodevalue:2005 ------------------------ nodename:price nodevalue:29.99 ------------------------ nodename:book nodevalue: XQueryKickStart JamesMcGovern 2003 49.99 nodenamecategory nodevalueweb ------------------------ nodename:title nodevalue:XQueryKickStart nodenamelang nodevalueen ------------------------ nodename:author nodevalue:JamesMcGovern ------------------------ nodename:year nodevalue:2003 ------------------------ nodename:price nodevalue:49.99 ------------------------ nodename:book nodevalue: LearningXML ErikT.Ray 2003 39.95 nodenamecategory nodevalueweb nodenamecover nodevaluepaperback ------------------------ nodename:title nodevalue:LearningXML nodenamelang nodevalueen ------------------------ nodename:author nodevalue:ErikT.Ray ------------------------ nodename:year nodevalue:2003 ------------------------ nodename:price nodevalue:39.95 ------------------------
关于节点的问题:
<bookcategory="cooking"> <titlelang="en">EverydayItalian</title> <author>GiadaDeLaurentiis</author> <year>2005</year> <price>30.00</price> </book>
对于book应用:doc.getChildNodes()得到一个NodeList其中NodeList的长度为9
9个节点分别如下:
title节点
lang节点
Everyday节点
author节点
GiadaDeLaurentiis节点
year节点
2005节点
price节点
30.00节点
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson
在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat
XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress