DOM解析需要把XML文档全部载入内存并且在内存中生成DOM树节点对象。
SAX解析用事件驱动的方式当载入XML文档时就开始解析。
关于JAXP
即java API For XML Process
如果没有JAXP,那么对于每个厂家的解析器,都要根据厂家实现类的不同而改变
如XMLReader reader=new A厂家();
有了JAXP后等于在厂家解析器和应用程序之间提供了一层抽象,尽管JAXP没提供新的方法,
如对于SAX解析方式,有了JAXP就可以实现为:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParserFactory是一抽象类,由厂家解析器去继承生成特定解析器的工厂
然后由 SAXParser parser = factory.newSAXParser();生成解析器实例
这样当要换掉解析器时,应用程序不必修改代码.
对于DOM解析则主要依赖DocumentBuilderFactory这个抽象类
dom4j用的是SAX解析器分析XML文档,它提供了DOMReader和SAXReader解析的方式,DOMReader是将dom模型转换为DOM4j数据结构,而SAXReader用SAX解析的方式来获取数据,如下代码:
1.SAXReader reader =new SAXReader();
reader.addHandler("/people/name",new MyHandler());
reader.read(new File("\\info.xml"));
2.SAXReader reader =new SAXReader();
Document document=reader.read(new File("\\info.xml"));
doc.accept(new MyVisitor());
3.SAXReader reader =new SAXReader();
Document document=reader.read(new File("\\info.xml"));
第一种方式是用添加元素处理器的方式,让处理器类实现ElementHandler接口 实现其onStart(ElementPath path)和onEnd(ElementPath path) 即当解析器处理到addHandler("",...)指定的元素时调用事件处理器.这种方式是基于事件的.不必等到文档解析完毕才处理.
第二种方式是通过访问者模式访问XML数据,处理类实现Visitor接口或者继承实现了Visitor接口的VisitorSuppert对象,
实现对应的visit方法.
第三种是dom4j内部用sax解析获得数据对象后换转为dom4j文档对象.
1.dom4j输出
a.转换为dom对象输出
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
DOMWriter write=new DOMWriter();
Document d=write.write(document);//转化为dom模型对象
DOMSource source=new DOMSource(d);
StreamResult result=new StreamResult(new File("DOM4J.xml"));//创建文件对象接收数据
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.transform(source, result);//dom模型数据输出到指定文件中
b.转换为xml数据流输出
//格式化对象
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("GB2312");
format.setIndent(" ");
XMLWriter writer=new XMLWriter(new FileWriter("DOM4J.xml"),format);
writer.write(document);
writer.close();
2.dom4j解析
a,SAXReader
接收xml文件
SAXReader reader=new SAXReader();
reader.read("");
b.DOMReader
接收dom对象转化为dom4j的document对象
DOMReader reader=new DOMReader();
org.dom4j.Document document=reader.read();