DOM:Document Object Model:文档对象模型,它是由W3C推荐的处理XML文档规范
SAX:Simple API for XML,是整个XML行业的事实规范
JAXP:Java解析XML文档的API成为JAXP,它k的全称是Java API for XML,JAXP作为JDK的一部分发布,但它仅仅是一些API接口,接口的设计允许应用程序咋子不用的XML解析器之间切换
DocumentBuilderFactory:获取DOM解析工厂类
DocumentBuilder:DOM解析器标准接口
SAXParserFactory:获取SAX解析器的工厂类
SAXParser:SAX解析器标准接口
SAX处理机制:
SAX采用事件机制的方式来解析XML文档,这是一种快速读写XML
流程:使用SAX机制解析XML文档时,SAX解析器负责在XML文档中“行走”,每当遇到文档开始、元素开始、文本、元素结束和文档结束时,都将负责向外发送事件,而程序员则负责提供事件监听器来监听这些事件,并通过事件获取XML文档信息
步骤:
SAX生成XML文档
BuildXMLMain.java
package com.muke.sax;
import java.io.File;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.helpers.AttributesImpl;
public class BuildXMLMain {
public static void main(String[] args) throws Exception {
//创建保存XML的结果流对象
Result resultXML=new StreamResult(new File("D://firstxml1.xml"));
//获取sax生成工厂实例
SAXTransformerFactory saxTransformerFactory=(SAXTransformerFactory) SAXTransformerFactory.newInstance();
//获取SAX生成处理者对象实例
TransformerHandler transformerHandler=saxTransformerFactory.newTransformerHandler();
transformerHandler.setResult(resultXML);
//获取SAX生成器
Transformer transformer=transformerHandler.getTransformer();
//yes表示可以生成空格
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//生成文档的开始
transformerHandler.startDocument();
AttributesImpl attrImpl=new AttributesImpl();
transformerHandler.startElement("", "", "书籍列表", attrImpl);
transformerHandler.startElement("", "", "计算机书籍", attrImpl);
transformerHandler.startElement("", "", "书名", attrImpl);
transformerHandler.characters("Java思想".toCharArray(), 0, "Java思想".length());
transformerHandler.endElement("", "", "书名");
transformerHandler.startElement("", "", "作者", attrImpl);
transformerHandler.characters("小王".toCharArray(), 0, "小王".length());
transformerHandler.endElement("", "", "作者");
transformerHandler.startElement("", "", "价格", attrImpl);
transformerHandler.characters("79.00".toCharArray(), 0, "79.00".length());
transformerHandler.endElement("", "", "价格");
transformerHandler.endElement("", "", "计算机书籍");
//第二本书
transformerHandler.startElement("", "", "计算机书籍", attrImpl);
transformerHandler.startElement("", "", "书名", attrImpl);
transformerHandler.characters("Spring指南".toCharArray(), 0, "Spring指南".length());
transformerHandler.endElement("", "", "书名");
transformerHandler.startElement("", "", "作者", attrImpl);
transformerHandler.characters("小李".toCharArray(), 0, "小李".length());
transformerHandler.endElement("", "", "作者");
transformerHandler.startElement("", "", "价格", attrImpl);
transformerHandler.characters("89.00".toCharArray(), 0, "89.00".length());
transformerHandler.endElement("", "", "价格");
transformerHandler.endElement("", "", "计算机书籍");
transformerHandler.endElement("", "", "书籍列表");
//告诉handler文档生成已结束
transformerHandler.endDocument();
System.out.println("XML文档生成成功!");
}
}
SAXParse
package com.muke.sax;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.muke.sax.handler.MuKeHandler;
public class SAXParse {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建SAX解析器工厂
SAXParserFactory factory= SAXParserFactory.newInstance();
//创建SAX解析器
SAXParser parser= factory.newSAXParser();
//开始解析XML文档
parser.parse("D://firstxml.xml", new MuKeHandler());
}
}
MuKeHandler
package com.muke.sax.handler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MuKeHandler extends DefaultHandler {
//定义一个变量来保存当前正在处理的tag
private String currentTag;
//每当处理文本数据时将触发该方法
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String content=new String(ch,start,length);
if (content.trim().length()>0) {
System.out.println("<"+currentTag+">元素的值是:"+content.trim());
}
}
//解析文档结束时触发该方法
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束");
}
//解析元素结束时触发该方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("处理元素结束:"+qName);
}
//每当解析文档开始时触发该方法
@Override
public void startDocument() throws SAXException {
System.out.println("解析文档开始");
}
@Override
public void startElemaent(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("开始处理元素:"+qName);
currentTag=qName;
if (attributes.getLength()>0) {
System.out.println("<"+currentTag+">元素的属性如下:");
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(i)+"--->"+attributes.getValue(i));
}
}
}
}