您的位置:首页 > 其它

传智博客学习之DOM与SAX

2009-12-20 21:54 190 查看
XML学习已经结束一段时间了,今天我们在做项目的过程中,当用到dom4j相关内容时,突然感觉脑袋一片空白,什么也记不起来,在冯老师细心地引导下,我们才慢慢想起具体内容,不过感觉编程起来还是有些手生,现在对某位高人说过的一句话十分赞同:程序不是看出来的,是敲出来的,要想成为顶级程序员,就是拼命地打,往死里打(哈哈,目前还没到状态)。但是真切的感受就是,如果程序学了不去使用,肯定就等于白学,由于前段时间学dom4j的时候,刚学完DHTML。所以感觉非常简单,所以忽略了练习,最终的见证就是,javaweb项目中死的很惨,所以,今天对XML相关知识进行整理,希望是亡羊补牢吧!

一、XML解析方式
1.Dom
1)描述
Document Object Model, 即文档对象模型,是 W3C 组织推荐的处理 XML 的标准接口。将文档载入到内存中处理,在内存中创建DOM树,然后按照文档及标签的层次关系解析成一个个具有树状结构关系的结点,并生成 DOM树上的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。这时候,一个较好的替代解决方法就是SAX,将所有的建立模型,创建对象,文档装载进内存,受到内存的限制,消耗内存

2.SAX
(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。它可以检测一个即将到来的 XML流,由此并不需要所有的XML代码同时载入到内存中,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。可以用java的代理机制来理解时间驱动机制,SAX采用事件处理的方式解析XML文件,主要涉及两个部分:解析器和事件处理器:
解析器负责读取 XML 文档,并向事件处理器发送事件
事件处理器负责对事件做出相应,对传递的 XML 数据进行处理

小结:SAX与DOM区别
DOM是复杂对象处理的首选,比如当XML比较复杂的时候,或者当你需要随机处理文档中数据的时候。DOM 为载入到内存的文档节点建立类型描述。最终,这些描述呈现了可容易横向移动、潜在巨大、树型结构。如果XML很冗长,DOM就会显示出无法控制的胀大。而SAX从文档的开始通过每一节点移动,以定位一个特定的节点。占用内存小,解析速度快。基于事件驱动,碰到一个标签,就会触发一个事件,边解析边装载,但是SAX没有容错能力。所以选择DOM与SAX,与在一个数据库中的表单与视图之前选择一样:选择适合于当前实际情况的方法。如果你只是想简单地查看XML文档而不处理它,那么请选择使用SAX

二、XML解析器
1.Crimsonsun公司开发的,后贡献给apache
2.Xerces IBM公司开发的,后贡献给apache,性能较优
3.Aelfred2 dom4j组织开发的
三、XML解析技术
1.JaxpJAXP 开发包是J2SE的一部分,sun的标准
1.1使用JAXP进行DOM解析编程
步骤如下:
1)获得DOM解析器
调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

Eg:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

2)获得Document 对象

调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了

Eg:Document document = builder.parse(new File("src/exam.xml"));

Element e = document.getDocumentElement();

3)通过Document对象获得相应结点,然后通过相应方法进行增删改查等操作

Eg:通过姓名删除一个学生结点

Document document = getDocument();

NodeList list = document.getElementsByTagName("name");

for(int i=0;i<list.getLength();i++){

Node node = list.item(i);

if(node.getTextContent().equals(name)){

node.getParentNode().getParentNode().removeChild(node.getParentNode());

4)更新XML文档

Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:

javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

Transformer对象通过TransformerFactory获得

Eg:

private static void writeXml(Document document) throws TransformerException {

DOMSource source = new DOMSource(document);

StreamResult result = new StreamResult(new File("src/exam.xml"));

TransformerFactory factory = TransformerFactory.newInstance();

Transformer trans = factory.newTransformer();

trans.transform(source, result);

}

1.2.通过sax解析xml文档步骤如下:
1) 使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
2) 通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
3) 通过解析器对象对到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();
4) 设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
5) 解析xml文件
xmlReader.parse("book.xml");
2.Jdom
解析器为Xerces,性能较差。
3.dom4j
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: