package com.xyls.xml;
import java.io.*;
import java.net.URI;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
/*需要把dom4j-1.6.1.jar包放到D:\Java\jdk1.7.0_09\jre\lib\ext中去
* 性能优异,功能强大,具有易用性
* Hibernate和Spring框架中都使用了DOM4J的解析操作
* 主要接口:
* Attribute属性操作
* Branch能够包含子节点的节点,定义一个公共的行为
* CDATA定义了XML CDATA区域
* CharacterData标识接口,基于字符的节点,如CDATA、Comment、Text
* Comment定义了XML的注释
* Document定义了XML文档
* Element定义了XML元素
* Text定义了xml文本节点
* 操作步骤与JDOM类似
* DOM4J本身还是需要使用SAX建立解析器
* 总结:DOM和SAX是基础,重点掌握就行
* */
public class DOM4JTest{
public void generateDocument(){//该方法生成一个新的xml文档
//使用DocumentHelper类创建一个文档实例,DocumentHelper是生成 XML 文档节点的 dom4j API 工厂类。
Document doc = DocumentHelper.createDocument();
//创建根元素
Element root = doc.addElement("catalog");
//添加一个注释
root.addComment("An XML Catalog");
//添加一个处理指令
root.addProcessingInstruction("target","text");
//添加一个元素
Element journal = root.addElement("journal");
//为journal元素增加两个属性title、publisher
journal.addAttribute("title","xml zone");
journal.addAttribute("publisher","IBM developerWorks");
//向journal中添加子元素
Element article = journal.addElement("article");
//为article元素增加两个属性level、date
article.addAttribute("level","Intermediate");
article.addAttribute("date","December-2001");
//向article元素中添加子元素
Element title = article.addElement("title");
//为title元素设置文本
title.setText("Java configuration with XML Schema");//方法从Node继续来的
//向article元素中添加子元素
Element author = article.addElement("author");//方法从Branch继承而来
//向author元素中添加子元素
Element firstname = author.addElement("firstname");
//设置文本
firstname.setText("Marcello");
//向author元素中添加子元素
Element lastname = author.addElement("lastname");
//设置文本
lastname.setText("Vitaletti");
//为文档添加类型说明
doc.addDocType("catalog", null, null);
//输出xml文件
try{
XMLWriter output = new XMLWriter(new FileWriter(new File("d:"+File.separator+"test"+File.separator+"catalog.xml")));
output.write(doc);
output.close();
}catch(Exception e){
e.printStackTrace();
}
}
//还需要把jaxen-1.1-beta-6.jar放到D:\Java\jdk1.7.0_09\jre\lib\ext中去
public void parserXML(File inputXml){
try{
//使用 SAXReader解析XML文档, SAXReader 包含在 org.dom4j.io 包中
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(inputXml);
//inputXml 是从 D:/TEST/catalog.xml
//使用 XPath 表达式从 article 元素中获得level属性节点列表。
//如果 level 属性值是Intermediate则改为“111111111”。
List list = doc.selectNodes("//article/@level" );
Iterator iter=list.iterator();
while(iter.hasNext()){
Attribute attribute=(Attribute)iter.next();
if(attribute.getValue().equals("Intermediate"))
attribute.setValue("111111111");
}
//使用 XPath 表达式从 article 元素中获得date属性节点列表。
list = doc.selectNodes("//article/@date" );
iter=list.iterator();
while(iter.hasNext()){
Attribute attribute=(Attribute)iter.next();
if(attribute.getValue().equals("December-2001"))
attribute.setValue("22222222");
}
//获取 article 元素列表,从 article 元素中的 title 元素得到一个迭代器,并修改 title 元素的文本。
list = doc.selectNodes("//article" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iterator iterator=element.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Java configuration with XMLSchema"))
titleElement.setText("aaaaaaaaaaaaaaaaa");
}
}
//从 article 元素中的 author 元素节点列表
list = doc.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("bbbbbbb");
}
}
//从 article 元素中的 author 元素节点列表
list = doc.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("cccccccccccc");
}
}
OutputFormat format = OutputFormat.createPrettyPrint();//设置输出格式
format.setEncoding("GBK");
XMLWriter output = new XMLWriter(new FileOutputStream(new File("d:"+
File.separator+"test"+File.separator+"catalog_modified.xml")),format);//输出文件
output.write(doc);//输出内容
output.close();
}catch(DocumentException e){
System.out.println(e.getMessage());
}catch(IOException e){
System.out.println(e.getMessage());
}
}
public static void main(String args[])throws Exception{
DOM4JTest dj = new DOM4JTest();
//dj.generateDocument();
File f = new File("D:"+File.separator+"test"+File.separator+"catalog.xml");
dj.parserXML(f);
}
}