您的位置:首页 > 编程语言 > Java开发

java解析xml之三:使用domj4

2008-05-19 20:12 831 查看
来自:http://sysu-zeh.javaeye.com/blog/119310

一.简介

DOM4J是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。DOM4J最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因。

二.安装dom4j

1.下载dom4j:http://sourceforge.net/project/showfiles.php?group_id=16035

2.安装dom4j:将解压后的dom4j-full.jar文件放置到项目的类路径中去,也可以作为附加包添加到项目中。

三.实例

1.所需xml文件

catalog.xml

xml version="1.0" encoding="GBK"?>

<catalog>

target text?>

<journal title="XML Zone" publisher="IBM developerWorks">

<article level="Intermediate" date="December-2001">

<title>Java configuration with XML Schematitle>

<author>

<firstname>Marcellofirstname>

<lastname>Vitalettilastname>

author>

article>

journal>

catalog>

2.修改xml文件

package domj4Parser;

import java.io.*;

//导入dom4j API类

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.XMLWriter;

public class XmlDom4J{

public void generateDocument(){

//使用 DocumentHelper 类创建一个文档实例

//DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类

Document document = DocumentHelper.createDocument();

//使用 addElement() 方法创建根元素 catalog

//addElement() 用于向 XML 文档中增加元素

Element catalogElement = document.addElement("catalog");

//在 catalog 元素中使用 addComment() 方法添加注释"An XML catalog"

catalogElement.addComment("An XML Catalog");

//在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令

catalogElement.addProcessingInstruction("target","text");

//在 catalog 元素中使用 addElement() 方法增加 journal 元素

Element journalElement = catalogElement.addElement("journal");

//使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 属性

journalElement.addAttribute("title", "XML Zone");

journalElement.addAttribute("publisher", "IBM developerWorks");

//向 article 元素中添加 journal 元素

Element articleElement=journalElement.addElement("article");

//为 article 元素增加 level 和 date 属性

articleElement.addAttribute("level", "Intermediate");

articleElement.addAttribute("date", "December-2001");

//向 article 元素中增加 title 元素

Element titleElement=articleElement.addElement("title");

//使用 setText() 方法设置 article 元素的文本

titleElement.setText("Java configuration with XML Schema");

//在 article 元素中增加 author 元素

Element authorElement=articleElement.addElement("author");

//在 author 元素中增加 firstname 元素并设置该元素的文本

Element firstNameElement=authorElement.addElement("firstname");

firstNameElement.setText("Marcello");

//在 author 元素中增加 lastname 元素并设置该元素的文本

Element lastNameElement=authorElement.addElement("lastname");

lastNameElement.setText("Vitaletti");

//可以使用 addDocType() 方法添加文档类型说明

//document.addDocType("catalog",null,"catalog.dtd");

try{

XMLWriter output = new XMLWriter(

new FileWriter(new File("xmlFile/catalog.xml")));

output.write(document);

output.close();

}

catch(IOException e){

System.out.println(e.getMessage());

}

}

public static void main(String[] argv){

XmlDom4J dom4j=new XmlDom4J();

dom4j.generateDocument();

}

}

3.生成xml文件

package domj4Parser;

import java.util.List;

import java.util.Iterator;

import java.io.*;

//导入 dom4j API 类

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.Attribute;

import org.dom4j.Node;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;

import org.dom4j.DocumentException;

import org.dom4j.io.SAXReader;

public class Dom4Jparser{

public void modifyDocument(File inputXml){

try{

//使用 SAXReader 解析 XML 文档 catalog.xml

SAXReader saxReader = new SAXReader();

//inputXml 是从 catalog.xml 创建的 java.io.File

Document document = saxReader.read(inputXml);

//使用 XPath 表达式从 article 元素中获得 level 节点列表

List list = document.selectNodes("//article/@level");

Iterator iter=list.iterator();

while(iter.hasNext()){

//如果 level 属性值是"Intermediate"则改为"Introductory"

Attribute attribute=(Attribute)iter.next();

if(attribute.getValue().equals("Intermediate"))

attribute.setValue("Introductory");

}

list = document.selectNodes("//article/@date" );

iter=list.iterator();

while(iter.hasNext()){

Attribute attribute=(Attribute)iter.next();

if(attribute.getValue().equals("December-2001"))

attribute.setValue("October-2002");

}

//获取 article 元素列表

list = document.selectNodes("//article" );

iter=list.iterator();

while(iter.hasNext()){

Element element=(Element)iter.next();

//使用Visitor模式遍历子节点

element.accept(new MyVisitor());

//从 article 元素中的 title 元素得到一个迭代器

Iterator iterator=element.elementIterator("title");

while(iterator.hasNext()){

Element titleElement=(Element)iterator.next();

//并修改 title 元素的文本

if(titleElement.getText().equals("Java configuration with XMLSchema"))

titleElement.setText("Create flexible and extensible XML schema");

}

}

list = document.selectNodes("//article/author" );

iter=list.iterator();

while(iter.hasNext()){

Element element=(Element)iter.next();

Iterator iterator=element.elementIterator("firstname");

while(iterator.hasNext()){

Element firstNameElement=(Element)iterator.next();

if(firstNameElement.getText().equals("Marcello"))

firstNameElement.setText("Ayesha");

}

}

list = document.selectNodes("//article/author" );

iter=list.iterator();

while(iter.hasNext()){

Element element=(Element)iter.next();

Iterator iterator=element.elementIterator("lastname");

while(iterator.hasNext()){

Element lastNameElement=(Element)iterator.next();

if(lastNameElement.getText().equals("Vitaletti"))

lastNameElement.setText("Malik");

}

}

XMLWriter output = new XMLWriter(

new FileWriter( new File("xmlFile/catalog-modified.xml")));

output.write(document);

output.close();

}

catch(DocumentException e){

e.printStackTrace();

}

catch(IOException e){

System.out.println(e.getMessage());

}

}

public void treeWalk(Element element) {

for (int i = 0,size = element.nodeCount();i < size;i++){

Node node = element.node(i);

if (node instanceof Element) {

treeWalk((Element) node);

}

else { /* do something....*/}

}

}

//处理中文问题

public int formatXMLFile(String filename){

int returnValue = 0;

try{

SAXReader saxReader = new SAXReader();

Document document = saxReader.read(new File(filename));

XMLWriter output = null;

/** 格式化输出,类型IE浏览一样 */

OutputFormat format = OutputFormat.createPrettyPrint();

/** 指定XML字符集编码 */

format.setEncoding("GBK");

output = new XMLWriter(new FileWriter(new File(filename)),format);

output.write(document);

output.close();

/** 执行成功,需返回1 */

returnValue = 1;

}

catch(Exception ex){

ex.printStackTrace();

}

return returnValue;

}

public static void main(String[] argv){

Dom4Jparser dom4jParser=new Dom4Jparser();

dom4jParser.modifyDocument(new File("xmlFile/catalog.xml"));

dom4jParser.formatXMLFile("xmlFile/catalog.xml");

}

}

4.使用Visitor模式

package domj4Parser;

import org.dom4j.Attribute;

import org.dom4j.Element;

import org.dom4j.VisitorSupport;

//Visitor模式

public class MyVisitor extends VisitorSupport {

public void visit(Element element){

System.out.println(element.getName());

}

public void visit(Attribute attr){

System.out.println(attr.getName());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: