读书人

【XML】XML解析模式

发布时间: 2012-10-21 09:00:07 作者: rapoo

【XML】XML解析方式

XML解析方式:

    dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

XML解析器

Crimson、Xerces 、Aelfred2

XML解析开发包

Jaxp、Jdom、dom4j

Jaxp

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

使用JAXP进行DOM解析

javax.xml.parsers 包中的DocumentBuilderFactory用于创—OM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

获得JAXP中的DOM解析器

    调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

DOM编程

DOM模型(document object model)

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。在dom中,节点之间关系如下:位于一个节点之上的节点是该节点的父节点(parent)一个节点之下的节点是该节点的子节点(children) 同一层次,具有相同父节点的节点是兄弟节点(sibling) 一个节点的下一个层次的节点集合是节点后代(descendant)父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor) 节点类型Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

DOM方式解析XML文件

遍历所有节点查找某一个节点删除结点更新结点添加节点

xml文件

<?xml version="1.0" encoding="UTF-8"?><书架><书><书名 id="1">Java就业培训教程</书名><作者>redarmy</作者><售价>39.00元</售价></书><书><书名>JavaScript网页开发</书名><作者>redarmy</作者><售价>28.00元</售价></书></书架>

解析xml文件

package net.csdn;import java.io.FileOutputStream;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.junit.Test;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class DomDemo {@Test//遍历public void read() throws ParserConfigurationException, SAXException, IOException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("src/book.xml");Node root = document.getElementsByTagName("书架").item(0);list(root);}private void list(Node node) {// TODO Auto-generated method stubif(node instanceof Element){System.out.println(node.getNodeName());}NodeList list = node.getChildNodes();for(int i=0; i<list.getLength(); i++){Node child = list.item(i);list(child);}}//读属性@Testpublic void read1() throws ParserConfigurationException, SAXException, IOException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("src/book.xml");Element node = (Element) document.getElementsByTagName("书名").item(0);System.out.println(node.getAttribute("id"));}//添加节点@Testpublic void insert() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("src/book.xml");//创建节点Element element = document.createElement("优惠价");element.setTextContent("29元");//加入到第一本书Element book = (Element) document.getElementsByTagName("书").item(0);book.appendChild(element);//把添加的书名写到文件中TransformerFactory tff = TransformerFactory.newInstance();Transformer ff = tff.newTransformer();ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));}//在指定位置添加@Testpublic void insert1() throws SAXException, IOException, ParserConfigurationException, TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("src/book.xml");//创建节点Element element = document.createElement("优惠价");element.setTextContent("29元");//获取参考节点Element price = (Element)document.getElementsByTagName("售价").item(0);//加入到第一本书Element book = (Element) document.getElementsByTagName("书").item(0);book.insertBefore(element, price);//把添加的书名写到文件中TransformerFactory tff = TransformerFactory.newInstance();Transformer ff = tff.newTransformer();ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));}//删除数据@Testpublic void delect() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("src/book.xml");//获取要删除节点Element element = (Element)document.getElementsByTagName("优惠价").item(0);//获取要删除节点的字节Element parent = (Element) element.getParentNode();parent.removeChild(element);//把添加的书名写到文件中TransformerFactory tff = TransformerFactory.newInstance();Transformer ff = tff.newTransformer();ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));}//删除数据@Testpublic void delect1() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("src/book.xml");//获取要删除节点Element element = (Element)document.getElementsByTagName("售价").item(0);element.getParentNode().getParentNode().removeChild(element.getParentNode());//把添加的书名写到文件中TransformerFactory tff = TransformerFactory.newInstance();Transformer ff = tff.newTransformer();ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));}//修改数据@Testpublic void update() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("src/book.xml");//获取要更新节点Element element = (Element)document.getElementsByTagName("售价").item(0);element.setTextContent("38元");//把添加的书名写到文件中TransformerFactory tff = TransformerFactory.newInstance();Transformer ff = tff.newTransformer();ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));}}

遍历所有节点

【XML】XML解析模式

读属性

【XML】XML解析模式

添加节点

【XML】XML解析模式

在指定位置添加节点

【XML】XML解析模式

删除某一数据

【XML】XML解析模式

删除一个表签

【XML】XML解析模式

修改数据

【XML】XML解析模式

SAX解析


在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:

解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

【XML】XML解析模式
SAX方式解析XML文档

使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());解析xml文件
xmlReader.parse("book.xml");
package net.csdn;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;public class SaxDemo {/** * @param args */public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//创建工厂SAXParserFactory spf = SAXParserFactory.newInstance();//创建sax解析器SAXParser sp = spf.newSAXParser();//获取读取器XMLReader xmlReader = sp.getXMLReader();        //设置事件处理器xmlReader.setContentHandler(new BookContenHandler1());//xmlReader.parse("src/book.xml");}}class BookContenHandler1 extends DefaultHandler{@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("<"+qName+">");}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {System.out.println(new String(ch,start,length));}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("<"+qName+">");}}


<书架>


<书>


<书名>
Java就业培训教程
<书名>


<作者>
redarmy
<作者>


<售价>
39.00元
<售价>


<书>


<书>


<书名>
JavaScript网页开发
<书名>


<作者>
redarmy
<作者>


<售价>
28.00元
<售价>


<书>


<书架>


读书人网 >XML SOAP

热点推荐