免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1241 | 回复: 0
打印 上一主题 下一主题

java解析xml:使用domj4 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-07 13:19 |只看该作者 |倒序浏览

java解析xml之三:使用domj4
一.简介
    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  
            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());   
    }   
}   

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/47207/showart_458866.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP