第2天 XML解析-dom、SAX、dom4j
XML解析技术概述
XML解析方式分为两种:dom和sax
l dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的解析XML 的一种方式。
l sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML解析器都支持它。
XML解析器:Crimson(sun)、Xerces(IBM)、Aelfred2(dom4j)
XML解析开发包:Jaxp(sun)、Jdom、dom4j、pull(android的sdk自带)
1 JAXP DOM解析
JAXP是 Sun 提供的一套XML解析API,很好的支持DOM和SAX解析方式。JAXP 开发包是J2SE的一部分,包括以下包或子包:javax.xml、org.w3c.dom 、org.xml.sax、
在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
DOM树形结构
例:DOM解析实例1
book.xml文档
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="b001"> <title>java 核心技术</title> <price>95</price> </book> <book id="b002"> <title>Javaking</title> <price>33</price> </book> </books>
public static void main(String[] args) throws Exception { //获得实例工厂 DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance(); //获得解析 DocumentBuilder builder =fac.newDocumentBuilder(); //获得document-解析xml文档 ,文件找不到异常: java.io.FileNotFoundException Document document = builder.parse("books.xml");//指java项目的根路径下的文件 //获得所有的book元素 NodeList bookElements = document.getElementsByTagName("book"); //遍历所有的book元素 for(int i=0;i<bookElements.getLength();i++){ //获得每一本书 Node node =bookElements.item(i); //将book转换成element(强制转换) Element bookEle = (Element)node; //获得id属性 String id = bookEle.getAttribute("id"); System.out.println(node.getNodeName() + " " + id); //获得子元素 NodeList cEle = bookEle.getChildNodes(); String childName =""; //遍历所有子元素 for(int j=0;j<cEle.getLength();j++){ //获得子元素的名称 childName = cEle.item(j).getNodeName(); //判断子元素是否是“title” if("title".equals(childName)) { //获得子元素的文本 String title=cEle.item(j).getTextContent(); System.out.println( "\t"+ childName+" " + title ); } if("price".equals(childName)){ String price = cEle.item(j).getTextContent(); System.out.println("\t"+ childName+" " + price ); } } } }
运行结果:
book b001
title java 核心技术
price 95
book b002
title Javaking
price 33
更多使用方法详见JDK1.6API,在javax.xml包下找到parsers,从里面的DocumentBuilder类开始。
使用DOM方式解析XML
(1)解析器工厂类DocumentBuilderFactory
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
(2)解析器类DocumentBuilder
- DocumentBuilder db = dbf.newDocumentBuilder();
(3)解析生成Document对象
- Document doc = db.parse("message.xml");
(4)通过Document对象查询节点
- document.getElementById 返回Node对象
- document.getElementsByTagName 返回NodeList对象
节点列表类NodeList:
l 节点列表类NodeList就是代表了一个包含一个或者多个Node的列表
l 可以简单的把它看成一个Node的数组
l 常用方法
- getLength():返回列表的长度。
- ArrayList size
- item(int):返回指定位置的Node对象
- ArrayList get(index)