首页 > WEB开发 > 后台开发 > XML解析(JAXP、DOM4J)
2014
08-09

XML解析(JAXP、DOM4J)

1、综述

1)XML解析方式分为两种:

① DOM解析:基于DOM的XML解析器将一个XML文档转换成一个DOM树,通过对DOM树的操作实现对XML文档数据的操作。

优点:W3C标准,增删改查操作(CRUD)方便(可随机访问)。

缺点:需要读取整个XML文档才能构建DOM树,对于比较大的XML文档,容易导致内存溢出。

② SAX解析:Simple API for XML,非官方标准是,属于**开源社区。

优点:边读边操作,而不必等到整个文档装载完才对文档进行操作。

缺点:只能进行查询。

2)XML解析开发包

JAXP:Java API for XML Processing,SUN公司推出的两种解析方式的标准实现。

DOM4J:开源产品,结合了两者的优点(牛,都在用的东西!)

 2、JAXP开发包

1)JAXP开发包是JavaSE的一部分,它由以下几个包及其子包组成:

org.w3c.dom:提供DOM方式解析XML的标准接口

org.xml.sax:提供SAX方式解析XML的标准接口

javax.xml:主要使用其子包,用于支撑DOM和SAX。

2)javax.xml.parsers包中定义了和XML解析器有关的两个工厂类:DocumentBuilderFactory和SaxParserFactory,通过这些工厂类得到对XML文档进行解析的DOM和SAX解析器对象。

3)利用JAXP进行DOM解析:

获取代表XML文档的Document对象(☆),主要有两步:

①创建DOM解析器对象(固定写法)

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder docBuilder= factory.newDocumentBuilder();

②将XML文档读取到内存,返回代表整个文档的Document对象。

Document doc = docBuilder.parse( “src/myxml.xml”);

这个过程可以形象的表示为下图:

03. XML编程3687

DOM解析方式中常用接口和方法如下:

①Node:getTagName()、getTextContent()、getChildNodes()、setTextContent()、appendChild()、insertBefore(newNode , oldNode)、removeChild(node)

  • Document:getElementsByTagName()、createElement(tagname);
  • Element:getElementsByTagName()、getAttribute(attrName)、setAttribute(name,value) ☆

②NodeList:getLength()、item(index)、

4)更新XML文档

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象(位于内存)输出到硬盘(即写到文档中)。这个过程有如下两步:

①创建Transformer对象(固定写法)

TransformerFactory factory = TransformerFactory.newInstance();

Transformer transformer = factory.newTransformer();

②调用transformer的transform()方法写入到硬盘,transform()方法的声明如下:

transform(Source xmlSource, Result outputTarget)

DOM和SAX方式解析均实现了Source接口,DOM解析方式中的transform()用法如下:

transformer.transform(new DOMSource(document) , new StreamResult(“src/myxml.xml”));

5)利用JAXP进行SAX解析:

SAX解析器在解析某个XML文档时,它只要解析到XML文档的一个组成部分,就会去调用事件处理器(主要是ContentHandler接口)中一个对应的方法,解析器在调用事件处理器的某个方法时,会把当前解析到的XML文件内容作为方法的参数传递给事件处理器中的对应方法。SAX解析过程有如下三步:

①获取XML读取器对象(固定写法)

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

XMLReader reader = parser.getXMLReader();

②给读取器注册事件处理器(实现ContentHandler接口的类)

reader.setContentHandler(new MyContentHandler());

③开始解析文档:

reader.parse(“src/myxml.xml”);

这个过程如下图所示:

03. XML编程4948

ContentHandler接口中常用方法有:startElement()、endElement()、characters(),这些方法分别在解析器解析到元素开始标签、元素结束标签、文本内容时被调用,实际开发中常编写一个类继承DefaultHandler类,覆写以上方法即可。

 3、最出色的解析工具:DOM4J

1)使用DOM4J开发,需下载DOM4J相应的jar文件。

2)DOM4J综合了DOM / SAX解析方式的优点,它模拟实现了DOM中的Node、Document、Element等接口,但并非真正的DOM模型,只是利用了DOM解析方式可以随机访问的优点。

3)DOM4J中,获得Document对象(DOM4J中模拟出来的)的方式有三种:

① 读取XML文件,获得document对象:

SAXReader reader = new SAXReader();

Document doc = reader.read(“src/myxml.xml”);

② 主动创建Document对象:

Document document = DocumentHelper.createDocument();

//创建根节点

Element root = document.addElement(“members”);

③ 解析XML形式的文本,得到document对象:

String text = “<members></members>”;

Document document = DocumentHelper.parseText(text);

4)将文档写回XML文件

①文档中全为英文,不设置编码,直接写入

XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”));

writer.write(document);

wirter.close();

②文档中含有中文,设置编码写入的形式

OutputFormat format = OutputFormat.createPrettyPrint();

//指定XMl编码

format.setEncoding(“GBK”);

XMLWriter writer = new XMLWriter(new FileOutputStream(“output.xml”),format);

writer.write(document);

writer.close();

5)DOM4J基本操作

① 元素节点

获取根节点:Element root = document.getRootElement();

获取节点的第一个book节点:Element book = ele.element(“book”);

获取节点下所有book节点:List<Element> books = ele.elements(“book”);

|– 通过List的iterator()方法返回迭代器进行遍历。

|– 也可通过parentEle.elementIterator(“book”)直接返回迭代器进行遍历。

添加子节点:Element ele = ele.addElement(“book”);

删除子节点:ele.getParent().remove(ele);【必须通过父节点删除】

 

② 元素中的文本操作:

获得文本:String bookname = nameEle.getText();

设置文本:nameEle.setText(“钢铁是怎样炼成的”);

 

③ 元素的属性操作:

获得属性:String name = ele.attributeValue(“name”);

增加属性:ele.addAttribute(“name”,”value”);

 

6)DOM4J高级操作1:在指定位置插入节点

① 得到插入位置的节点列表(list)

② 调用list.add(index , element),将element插入到指定位置。其中element元素可以通过DocumentHelper创建,如下代码:

Element press = DocumentHelper.createElement(“press”);

press.setText(“钢铁工业出版社”);

List list = root.element(“book”).elements(); //获得与press同级的元素列表

list.add(1 , press);

//更新XML

7)DOM4J高级操作2:利用XPath快速查找节点

当XML元素嵌套层数过多时,需要用element()方法一层一层的往里面找,比较麻烦,此时可以借助XPath表达式快速定位节点。Node接口中定义了如下两个方法:

①public List selectNodes(xpathExpression) 如:List list = document.selectNodes(“//foo/bar”);

②public Node selectSingleNode(xpathExpression) 如:Node node = document.selectSingleNode(“//foo/bar/author”);

除此之外还有一个常用的方法:

③public String valueOf(xpathExpression) 如:String name = node.valueOf( “@name” );

 

XPath表示XML路径,同文件系统中路径的概念类似,基本语法如下:

①如果路径以 / 开始,那么该路径就表示一个元素的绝对路径。

②如果路径以 // 开始,表示选择文档中所有满足双斜线之后规则的元素。

③方括号里的表达式可以进一步限定元素。数字表示元素在选择集里的位置,last()函数则表示选择集中的最后一个元素。

④@表示元素的属性。

关于XPath的更多信息可以参考XPath Tutorial。


留下一个回复

你的email不会被公开。