用JDK自带的包来解析XML文件(DOM+xpath)
DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2)org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
先来写一个xml文件(DTD文件请参阅XML DTD那篇博文):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book SYSTEM "D:\workspace\XML\WebRoot\WEB-INF\book.dtd"> <book> <bookname name="XML详解" font="GB2312"></bookname> <authors> <author name="张孝祥" sex="男" age="45"></author> <author name="王勇" sex="男" age="35"></author> <author name="王波" sex="男" age="30"></author> </authors> <price value="¥55"></price> <publishdate> <value>2009-08-18</value> </publishdate> </book>
再来写解析xml文件的java文件:
package com.xml.jdk; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XPathForXml { public void parseXMLWithJdk(){ try { //读取book.xml到内存 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder dbd = dbf.newDocumentBuilder(); Document doc = dbd.parse(new FileInputStream("D:\\workspace\\XML\\WebRoot\\WEB-INF\\book.xml")); //通过XML获得book的authors的author子节点列表 XPathFactory f = XPathFactory.newInstance(); XPath path = f.newXPath(); NodeList authors= (NodeList) path.uate("book/authors/author", doc,XPathConstants.NODESET); System.out.println(authors.getLength()); //遍历取到的元素 if(authors!=null){ for(int i=0;i<authors.getLength();i++){ Node author = authors.item(i); int n = i + 1; System.out.print(n+". 名字:"+author.getNodeName()); System.out.println(); } } //获得book的authors的第一个子节点,注意NODESET和NODE的区别 Node author= (Node) path.uate("book/authors/author", doc,XPathConstants.NODE); System.out.println(" 名称:"+author.getNodeName()); System.out.println(" 内容:"+author.getTextContent());//如果存在内容则返回内容,不存在则返回空 //获取节点的属性 NamedNodeMap attr = author.getAttributes(); System.out.println(" 该节点的属性个数"+attr.getLength()); //遍历元素的属性 if(attr!=null){ for(int i=0;i<attr.getLength();i++){ int n = i + 1; System.out.print(" 属性"+n+" 名称:"+attr.item(i).getNodeName()); System.out.print(" 值:"+attr.item(i).getNodue()); System.out.print(" 类型:"+attr.item(i).getNodeType()); System.out.println(); } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } public static void main(String[] args) { new XPathForXml().parseXMLWithJdk(); } }
下面对DOM读取XML的代码进行讲解:
(1)得到DOM解析器的工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
得到javax.xml.parsers.DocumentBuilderFactory;类的实例就是我们要的解析器工厂
(2)从DOM工厂获得DOM解析器
DocumentBuilder dbd = domfac.newDocumentBuilder();
通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器
(3)把要解析的XML文档转化为输入流,以便DOM解析器解析它
InputStream is=new FileInputStream("D:\\workspace\\XML\\WebRoot\\WEB-INF\\book.xml");
InputStream是一个接口。
(4)解析XML文档的输入流,得到一个Document
Document doc=dombuilder.parse(is);
由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的