dom4j读写xml文件

这篇文章是讲述关于dom4j解析xml文件的,可以作为学习xml解析的好例子。

首先我们给出一段示例程序: 

[java]  view plain copy
  1. import java.io.File;  
  2. import java.io.FileWriter;  
  3. import java.util.Iterator;  
  4.   
  5. import org.dom4j.Document;  
  6. import org.dom4j.DocumentHelper;  
  7. import org.dom4j.Element;  
  8. import org.dom4j.io.OutputFormat;  
  9. import org.dom4j.io.SAXReader;  
  10. import org.dom4j.io.XMLWriter;  
  11.   
  12. public class DOM4JTest {  
  13.   
  14.     /** */  
  15.     /** */  
  16.     /** */  
  17.     /** 
  18.      * DOM4J读写XML示例 
  19.      *  
  20.      * @param args 
  21.      * @throws Exception 
  22.      */  
  23.     public static void main(String[] args) {  
  24.         try {  
  25.             XMLWriter writer = null;// 声明写XML的对象  
  26.             SAXReader reader = new SAXReader();  
  27.   
  28.             OutputFormat format = OutputFormat.createPrettyPrint();  
  29.             format.setEncoding("GBK");// 设置XML文件的编码格式  
  30.   
  31.             String filePath = "d:\\student.xml";  
  32.             File file = new File(filePath);  
  33.             if (file.exists()) {  
  34.                 Document document = reader.read(file);// 读取XML文件  
  35.                 Element root = document.getRootElement();// 得到根节点  
  36.                 boolean bl = false;  
  37.                 for (Iterator i = root.elementIterator("学生"); i.hasNext();) {  
  38.                     Element student = (Element) i.next();  
  39.                     if (student.attributeValue("sid").equals("001")) {  
  40.                         // 修改学生sid=001的学生信息  
  41.                         student.selectSingleNode("姓名").setText("王五");  
  42.                         student.selectSingleNode("年龄").setText("25");  
  43.   
  44.                         writer = new XMLWriter(new FileWriter(filePath), format);  
  45.                         writer.write(document);  
  46.                         writer.close();  
  47.                         bl = true;  
  48.                         break;  
  49.                     }  
  50.                 }  
  51.                 if (bl) {  
  52.                     // 添加一个学生信息  
  53.                     Element student = root.addElement("学生");  
  54.                     student.addAttribute("sid""100");  
  55.                     Element sid = student.addElement("编号");  
  56.                     sid.setText("100");  
  57.                     Element name = student.addElement("姓名");  
  58.                     name.setText("嘎嘎");  
  59.                     Element sex = student.addElement("性别");  
  60.                     sex.setText("男");  
  61.                     Element age = student.addElement("年龄");  
  62.                     age.setText("21");  
  63.   
  64.                     writer = new XMLWriter(new FileWriter(filePath), format);  
  65.                     writer.write(document);  
  66.                     writer.close();  
  67.                 }  
  68.             } else {  
  69.                 // 新建student.xml文件并新增内容  
  70.                 Document _document = DocumentHelper.createDocument();  
  71.                 Element _root = _document.addElement("学生信息");  
  72.                 Element _student = _root.addElement("学生");  
  73.                 _student.addAttribute("sid""001");  
  74.                 Element _id = _student.addElement("编号");  
  75.                 _id.setText("001");  
  76.                 Element _name = _student.addElement("姓名");  
  77.                 _name.setText("灰机");  
  78.                 Element _age = _student.addElement("年龄");  
  79.                 _age.setText("18");  
  80.   
  81.                 writer = new XMLWriter(new FileWriter(file), format);  
  82.                 writer.write(_document);  
  83.                 writer.close();  
  84.             }  
  85.             System.out.println("操作结束! ");  
  86.         } catch (Exception e) {  
  87.             e.printStackTrace();  
  88.         }  
  89.   
  90.     }  
  91. }  

执行上面的java代码,结果如下:


下面看一下循环解析节点:

[java]  view plain copy
  1. private void getAllNodes(String xml) {  
  2.         try {  
  3.             Document authtmp = DocumentHelper.parseText(xml);  
  4.             List list = authtmp.selectNodes("//sms/node");  
  5.             for (int j = 0; j < list.size(); j++) {  
  6.                 Element node = (Element) list.get(j);  
  7.                 nodeByNodes(node);  
  8.             }  
  9.         } catch (Exception e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  
  13.   
  14.     private void nodeByNodes(Element node) {  
  15.         if (node.element("node") != null) {  
  16.             String id = node.attributeValue("id");  
  17.             String name = node.attributeValue("name");  
  18.             System.out.print(id + "-------");  
  19.             System.out.println(name);  
  20.             for (Iterator i = node.elementIterator("node"); i.hasNext();) {  
  21.                 Element newNode = (Element) i.next();  
  22.                 nodeByNodes(newNode);  
  23.             }  
  24.         } else {  
  25.             String id = node.attributeValue("id");  
  26.             String name = node.attributeValue("name");  
  27.             System.out.print(id + "-------");  
  28.             System.out.println(name);  
  29.         }  
  30.     }  
现在DOM4J的解释

一.Document对象相关

1.读取XML文件,获得document对象.

      SAXReader reader = new SAXReader();
      Document   document = reader.read(new File("input.xml"));


2.解析XML形式的文本,得到document对象.

      String text = "";
      Document document = DocumentHelper.parseText(text);


3.主动创建document对象.

      Document document = DocumentHelper.createDocument();
      Element root = document.addElement("members");// 创建根节点


二.节点相关

1.获取文档的根节点.

     Element rootElm = document.getRootElement();


2.取得某节点的单个子节点.

     Element memberElm=root.element("member");// "member"是节点名


3.取得节点的文字

     String text=memberElm.getText();

也可以用:

     String text=root.elementText("name");

这个是取得根节点下的name字节点的文字.

4.取得某节点下名为"member"的所有字节点并进行遍历.

List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
    Element elm = (Element) it.next();
   // do something
}


5.对某节点下的所有子节点进行遍历.

 for(Iterator it=root.elementIterator();it.hasNext();){
      Element element = (Element) it.next();
      // do something
 }


6.在某节点下添加子节点.

Element ageElm = newMemberElm.addElement("age");


7.设置节点文字.

ageElm.setText("29");


8.删除某节点.

parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点


9.添加一个CDATA节点.

         Element contentElm = infoElm.addElement("content");
         contentElm.addCDATA(diary.getContent());         
         contentElm.getText(); // 特别说明:获取节点的CDATA值与获取节点的值是一个方法
         contentElm.clearContent(); //清除节点中的内容,CDATA亦可


三.属性相关.
1.取得某节点下的某属性

 Element root=document.getRootElement();  
 Attribute attribute=root.attribute("size");// 属性名name


2.取得属性的文字

     String text=attribute.getText();

也可以用:

     String text2=root.element("name").attributeValue("firstname");

这个是取得根节点下name字节点的属性firstname的值.

3.遍历某节点的所有属性

            Element root=document.getRootElement();    
            for(Iterator it=root.attributeIterator();it.hasNext();)
                 Attribute attribute = (Attribute) it.next();
                 String text=attribute.getText();
                 System.out.println(text);
             }


4.设置某节点的属性和文字.

newMemberElm.addAttribute("name", "sitinspring");


5.设置属性的文字

             Attribute attribute=root.attribute("name");
             attribute.setText("sitinspring");


6.删除某属性

             Attribute attribute=root.attribute("size");// 属性名name
             root.remove(attribute);


四.将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.

             XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
             writer.write(document);
             writer.close();


2.文档中含有中文,设置编码格式写入的形式.

             OutputFormat format = OutputFormat.createPrettyPrint();
             format.setEncoding("GBK");    // 指定XML编码        
             XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);        
             writer.write(document);
             writer.close();


五.字符串与XML的转换
1.将字符串转化为XML

String text = " sitinspring ";
Document document = DocumentHelper.parseText(text);


2.将文档或节点的XML转化为字符串.

             SAXReader reader = new SAXReader();
             Document   document = reader.read(new File("input.xml"));    
             Element root=document.getRootElement();  String docXmlText=document.asXML();
             String rootXmlText=root.asXML();
             Element memberElm=root.element("member");
             String memberXmlText=memberElm.asXML();

你可能感兴趣的:(XML,JavaEE,Web开发,xml)