利用Dom4j操作XML文档,Demo笔记

Demo1 

 

package  com.gxd.xml;

import  java.io.FileWriter;
import  java.io.IOException;
import  java.io.UnsupportedEncodingException;

import  org.dom4j.Document;
import  org.dom4j.DocumentHelper;
import  org.dom4j.Element;
import  org.dom4j.io.OutputFormat;
import  org.dom4j.io.XMLWriter;

/**
 * 使用Dom4j API构建一个Dom4j树,输出为一个XML文档
 * 
@author eastlift
 *
 
*/

public   class  Dom4jDemo  {

    
public static void main(String[] args) {
        Document doc 
= DocumentHelper.createDocument();
        
// public Document addProcessingInstruction(String target,
        
// String text)
        
// 添加预处理指令
        doc.addProcessingInstruction("xml-stylesheet",
                
"type="text/xsl" href="student.xsl"");
        Element root 
= doc.addElement("students");

        Element elStu1 
= root.addElement("student");
        Element elName1 
= elStu1.addElement("name");
        Element elAge1 
= elStu1.addElement("age");
        elName1.setText(
"张三");
        elAge1.setText(
"20");

        Element elStu2 
= root.addElement("student");
        Element elName2 
= elStu2.addElement("name");
        Element elAge2 
= elStu2.addElement("age");
        elName2.setText(
"王五");
        elAge2.setText(
"22");

        
// 这样格式不满意
        
// PrintWriter pw = new PrintWriter(System.out);
        
// try {
        
// doc.write(pw);
        
// pw.close();
        
// } catch (IOException e) {
        
// e.printStackTrace();
        
// }

        
// 这样格式就满意了
        
// OutputFormat(空位,是否换行,字符编码);
        OutputFormat outfm = new OutputFormat("    "true"gb2312");
        
try {
            
// XMLWriter xmlw = new XMLWriter(outfm);
            
// 输出至文件
            XMLWriter xmlw = new XMLWriter(new FileWriter("dom4jDemo.xml"),
                    outfm);
            xmlw.write(doc);
            xmlw.close();
        }
 catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
 catch (IOException e1) {
            e1.printStackTrace();
        }

    }

}

 

Dome2

 

package  com.gxd.xml;

import  org.dom4j.Attribute;
import  org.dom4j.Document;
import  org.dom4j.DocumentException;
import  org.dom4j.Element;
import  org.dom4j.ProcessingInstruction;
import  org.dom4j.VisitorSupport;
import  org.dom4j.io.SAXReader;

/**
 * 利用访问者模式,遍历XML文档树
 * 
 * 
@author eastlift
 * 此DEMO所用的student.xml内容如下:
 * <?xml version="1.0" encoding="utf-8"?>
    <students>
        <student sn="001">
            <name>张三</name>
            <age>18</age>
        </student>
        <student sn="002">
            <name>李四</name>
            <age>20</age>
        </student>
        <student sn="003">
            <name>王五</name>
            <age>19</age>
        </student>
    </students>
  <h2>处理输出结果<h2>:
      元素名:students
    元素名:student
    属性:sn =001
    元素名:name  文本  张三
    元素名:age  文本  18
    元素名:student
    属性:sn =002
    元素名:name  文本  李四
    元素名:age  文本  20
    元素名:student
    属性:sn =003
    元素名:name  文本  王五
    元素名:age  文本  19
 
*/

public   class  Dom4jVisitorDemo  {

    
public static void main(String[] args) {
        SAXReader saxReder 
= new SAXReader();
        
try {
            Document doc 
= saxReder.read("student.xml");
            doc.accept(
new myVisitor());
        }
 catch (DocumentException e) {
            e.printStackTrace();
        }

    }


    
/**
     * 访问者, 定义成了内部类,继承VisitorSupport,重写需要的方法 VisitorSupport 实现了 Visitor接口
     * 
     * 
@author eastlift
     * 
     
*/

    
private static class myVisitor extends VisitorSupport {

        
public void visit(Attribute note) {
            System.out.println(
"属性:" + note.getName() + " =" + note.getValue());
        }


        
public void visit(Element note) {
            
// 判断这个元素是否是只有文本内容,
            
// 如果有文本内容则将文本内容和元素名称打印出来,
            
// 否则只将元素名称打印出来
            if (note.isTextOnly()) {
                System.out.println(
"元素名:" + note.getName() + "  文本  "
                        
+ note.getText());
            }
 else {
                System.out.println(
"元素名:" + note.getName());
            }

        }


        
// 处理指令
        public void visit(ProcessingInstruction pi) {
            System.out.println(
"处理指令:" + pi.getTarget() + " " + pi.getText());
        }

    }

}

 

Demo3

 

package  com.gxd.xml;

import  java.io.File;

import  org.dom4j.DocumentException;
import  org.dom4j.Element;
import  org.dom4j.ElementHandler;
import  org.dom4j.ElementPath;
import  org.dom4j.io.SAXReader;
/**
 * Dom4j支持对文档的基于事件的处理。
 * 对于较大的XML文档,我们可以利用Dom4j的基于事件处理的模型,在解析的过程中进行处理,而不必等到整个文档解析完再处理。
 * 一个元素,对应一个ElementHandler
 * ElementHandler是一个接口,里面有两个方法,当元素的标签开始时调用onStart(),结束时调用onEnd()
 * 此DEMO的XML文档如下:
 * <?xml version="1.0" encoding="utf-8"?>
    <students>
        <student sn="001">
            <name>张三</name>
            <age>18</age>
        </student>
        <student sn="002">
            <name>李四</name>
            <age>20</age>
        </student>
        <student sn="003">
            <name>王五</name>
            <age>19</age>
        </student>
    </students>
 * 处理结果:
 *     001
    name-----张三
    age-----18
    002
    name-----李四
    age-----20
    003
    name-----王五
    age-----19
 * 
@author eastlift
 *
 
*/

public   class  Dom4jElementHandler  {
    
    
public static void main(String[] args) {
        SAXReader saxReader 
= new SAXReader();
        
// 两个参数,第一个用于指定元素的路径
        
//
        saxReader.addHandler("/students/student"new studentHandler());
        
try {
            saxReader.read(
new File("student.xml"));
        }
 catch (DocumentException e) {
            e.printStackTrace();
        }

    }


    
private static class studentHandler implements ElementHandler {
        
public void onStart(ElementPath path) {
            Element elt 
= path.getCurrent();
            System.out.println(elt.attributeValue(
"sn"));
            
// 两个参数,第一个用于指定元素的路径,可以用相对路径,也可以用相对路径
            path.addHandler("name"new nameHandler());
        }


        
public void onEnd(ElementPath path) {
            path.removeHandler(
"name");
        }

    }


    
private static class nameHandler implements ElementHandler {
        
public void onStart(ElementPath path) {
            
// 两个参数,第一个用于指定元素的路径,这里用了绝对路径,绝对路径是以 "/"开头的
            path.addHandler("/students/student/age"new ageHandler());
        }


        
public void onEnd(ElementPath path) {
            Element elt 
= path.getCurrent();
            System.out.println(elt.getName()
+"-----"+elt.getText());
            path.removeHandler(
"age");
        }

    }

    
private static class ageHandler implements ElementHandler {
        
public void onStart(ElementPath path) {
        }


        
public void onEnd(ElementPath path) {
            Element elt 
= path.getCurrent();
            System.out.println(elt.getName()
+"-----"+elt.getText());
        }

    }

}

 

这三个Demo均听自孙鑫老师XML讲解后,所练习Demo。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值