Dom4j的使用

Dom4j 使用简介
 
示例XML文档(holen.xml
 
为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。
 

 

holen.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
    <!--This is a test for dom4j, holen, 2004.9.11-->
    <book show="yes">
       <title>Dom4j Tutorials</title>
    </book>
    <book show="yes">
       <title>Lucene Studing</title>
    </book>
    <book show="no">
       <title>Lucene in Action</title>
    </book>
    <owner>O'Reilly</owner>
</books>

 

 
这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[owner]信息。
 
3 建立一个XML文档
 

 

 
   
    public int createXMLFile(String filename){
      
       int returnValue = 0;
      
       Document document = DocumentHelper.createDocument();
      
       Element booksElement = document.addElement("books");
      
       booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
      
       Element bookElement = booksElement.addElement("book");
      
       bookElement.addAttribute("show","yes");
      
       Element titleElement = bookElement.addElement("title");
      
       titleElement.setText("Dom4j Tutorials");
      
      
       bookElement = booksElement.addElement("book");
       bookElement.addAttribute("show","yes");
       titleElement = bookElement.addElement("title");
       titleElement.setText("Lucene Studing");
       bookElement = booksElement.addElement("book");
       bookElement.addAttribute("show","no");
       titleElement = bookElement.addElement("title");
       titleElement.setText("Lucene in Action");
      
      
       Element ownerElement = booksElement.addElement("owner");
       ownerElement.setText("O'Reilly");
      
       try{
          
           XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
           writer.write(document);
           writer.close();
          
           returnValue = 1;
       }catch(Exception ex){
           ex.printStackTrace();
       }
             
       return returnValue;
    }

 

 
说明:
Document document = DocumentHelper.createDocument();
通过这句定义一个XML文档对象。
 
Element booksElement = document.addElement("books");
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
        addComment:添加注释
        addAttribute:添加属性
        addElement:添加子元素
 
最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。
 
生成后的holen.xml文件内容如下:
 

 

 
<?xml version="1.0" encoding="UTF-8"?>
<books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>

 

 
4 修改XML文档
 
有三项修改任务,依次为:
        如果book节点中show属性的内容为yes,则修改成no
        把owner项内容改为Tshinghua,并添加date节点
        若title内容为Dom4j Tutorials,则删除该节点
 

 

 
   
    public int ModiXMLFile(String filename,String newfilename){
       int returnValue = 0;
       try{
           SAXReader saxReader = new SAXReader();
           Document document = saxReader.read(new File(filename));
          
          
           List list = document.selectNodes("/books/book/@show" );
           Iterator iter = list.iterator();
           while(iter.hasNext()){
              Attribute attribute = (Attribute)iter.next();
              if(attribute.getValue().equals("yes")){
                  attribute.setValue("no");
              
           }
          
          
           list = document.selectNodes("/books/owner" );
           iter = list.iterator();
           if(iter.hasNext()){
              Element ownerElement = (Element)iter.next();
              ownerElement.setText("Tshinghua");
              Element dateElement = ownerElement.addElement("date");
              dateElement.setText("2004-09-11");
              dateElement.addAttribute("type","Gregorian calendar");
           }
          
          
           list = document.selectNodes("/books/book");
           iter = list.iterator();
           while(iter.hasNext()){
              Element bookElement = (Element)iter.next();
              Iterator iterator = bookElement.elementIterator("title");
              while(iterator.hasNext()){
                  Element titleElement=(Element)iterator.next();
                  if(titleElement.getText().equals("Dom4j Tutorials")){
                     bookElement.remove(titleElement);
                  }
              }
                  
          
           try{
             
              XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
              writer.write(document);
              writer.close();
             
              returnValue = 1;
           }catch(Exception ex){
              ex.printStackTrace();
           }
          
       }catch(Exception ex){
           ex.printStackTrace();
       }
       return returnValue;
    }
   

 

 
说明:
List list = document.selectNodes("/books/book/@show" );
list = document.selectNodes("/books/book");
上述代码通过xpath查找到相应内容。
 
通过setValue()、setText()修改节点内容。
 
通过remove()删除节点或属性。
 
5 格式化输出和指定编码
 
默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。
 

 

 
   
   
    public int formatXMLFile(String filename){
       int returnValue = 0;
       try{
           SAXReader saxReader = new SAXReader();
           Document document = saxReader.read(new File(filename));
           XMLWriter writer = null;
          
           OutputFormat format = OutputFormat.createPrettyPrint();
          
           format.setEncoding("GBK");
           writer= new XMLWriter(new FileWriter(new File(filename)),format);
           writer.write(document);
           writer.close();     
          
           returnValue = 1;    
       }catch(Exception ex){
           ex.printStackTrace();
       }
       return returnValue;
    }

 

 
说明:
 
OutputFormat format = OutputFormat.createPrettyPrint();
这句指定了格式化的方式为缩进式,则非紧凑式。
 
format.setEncoding("GBK");
指定编码为GBK。
 
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。
 
 

=================================================================================================

 

如果我们格式化一个xml文件话,我们可能使用下面的方法:
try{
           SAXReader saxReader new SAXReader(); 
        注释:先读入一个文件流
           Document doc= saxReader.read(new FileInputStream(new File(filePath)));
          
               注释:创建输出格式
          OutputFormat format OutputFormat.createPrettyPrint();
              注释:制定输出xml的编码类型
           format.setEncoding("GBK");
        注释:创建一个文件输出流
           XMLWriter writer= new XMLWriter(new FileWriter(new File(filename)),format);
        注释:将格式化后的xml串写入到文件
           writer.write(doc);
           writer.close();      
       }catch(Exception ex){
           ……
       }

经过的步骤是:
读取xml文件,然后再格式化输出。
那么,如果我们得到了一个XML的串,当然,是在内存中的,我们有如何返回一个格式化后的串呢?
其实也很简单,就是先把xml的串读到一个流中,然后解析,在格式化输出就可以了。下面就是我的实现;

注释:str是你的参数,也就是在内存中的没有格式化过的xml串
public static String format(String str) throws UnsupportedEncodingException,
      IOException, DocumentException {
    //System.out.println(" str  str);
    
    SAXReader reader=new SAXReader();
    //System.out.println(reader);
    注释:创建一个串的字符输入流
    StringReader in=new StringReader(str);
    Document doc=reader.read(in);
   // System.out.println(doc.getRootElement());
    注释:创建输出格式
    OutputFormat formater=OutputFormat.createPrettyPrint();
        注释:设置xml的输出编码
formater.setEncoding("utf-8");
    注释:创建输出(目标)
    StringWriter out=new StringWriter();
    注释:创建输出流
    XMLWriter writer=new XMLWriter(out,formater);
       注释:输出格式化的串到目标中,执行后。格式化后的串保存在out中。
writer.write(doc);
    
    //writer.close();
System.out.println(out.toString());
注释:返回我们格式化后的结果
    return out.toString();       
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值