正在加载……
专注、离线、切勿分心
DOM4J解析XML文档:
█ Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
█ Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
█ 使用Dom4j开发,需下载dom4j相应的jar文件。


Document对象: 节点对象:
DOM4j中,获得Document对象的方式有三种:
        1.读取XML文件,获得document对象            
           SAXReader reader = new SAXReader();
           Document document = reader.read(url);
        2.解析XML形式的文本,得到document对象.
           String text = "<members></members>";              
           Document document = DocumentHelper.parseText(text);
        3.主动创建document对象.
            Document document = DocumentHelper.createDocument();             //创建根节点
            Element root = document.addElement("members");
1.获取文档的根节点.
        Element root = document.getRootElement();

2.取得某个节点的子节点.
        Element element=node.element(“书名");
        element.element("售价");

3.取得节点的文字
        String text=node.getText();

节点对象: 节点对象属性 
4.取得某节点下所有名为“member”的子节点,并打印出来。
    List nodes = rootElm.elements("member");  

5.在某节点下添加子节点。
   Element ageElm = newMemberElm.addElement("age");

6.设置节点文字。
    element.setText("29");

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

8.添加一个CDATA节点。
Element contentElm = infoElm.addElement("content"); contentElm.addCDATA(diary.getContent());

1.取得某节点下的某属性    
     Element root=document.getRootElement();        //属性名name
     Attribute attribute=root.attribute("size");

2.取得属性的文字    
     String text=attribute.getText();

3.删除某属性  
     Attribute attribute=root.attribute("size"); root.remove(attribute);

4.获取某节点的所有属性   
     Element root=document.getRootElement();         
     List attributes =root.attributes();

5.设置某节点的属性和文字。
     newMemberElm.addAttribute("name", "sitinspring");

6.设置属性的文字   
     Attribute attribute=root.attribute("name");  
     attribute.setText("sitinspring");

将文档写入XML文件 
1.文档中全为英文,不设置编码,直接写入的形式。
XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));   
writer.write(document);   writer.close();
2.文档中含有中文,设置编码格式写入的形式。
OutputFormat format = OutputFormat.createPrettyPrint();     // 指定XML编码                 
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);
writer.write(document);
writer.close();


Books.xml Dom4j.java
<?xml version="1.0" encoding="utf-8"  ?>
<书架>
        <书>
        <书名 id="001">浪潮之巅</书名>
                <作者>吴军</作者>
                <售价>29</售价>
        </书>
        <书>
                <书名 id='002'>数学之美</书名>
                <作者>吴军</作者>
                <售价><第一版>29</第一版></售价>
        </书>
</书架>
package com.java.dom4j;

import java.io.FileOutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jDemo {
        public static void main(String[] args) throws Exception {
//这里要导入第三方架包,右键->新建文件夹(lib),把dom4j-1.6.1.jar拷贝进来;然后选中右键->构建路径->添加到构建路径,资源下回出现“引用的库”,这时候才能点开架包使用
//做完上面的操作,写代码系统就会提示导入刚才加架包
//通过saxreader获取document对象
SAXReader reader = new SAXReader(); 
Document document = reader.read("Books.xml");
 //按照dom的方式进行操作
        /*1、得到某个具体的节点内容
        2、打印某节点的所有元素节点
        3、修改某个元素节点的主体内容
        4、向指定元素节点中增加子元素节点
        5、向指定元素节点上增加同级元素节点
        6、删除指定元素节点
        7、操作XML文件属性*/
//获取某个具体的节点内容,得到第一本书的售价
Element root=document.getRootElement();
Element firstBookelement=root.element("书");  //这个方法时找出满足条件的第一个元素返回
Element priceElement = firstBookelement.element("售价");
String price = priceElement.getText();
System.out.println("Dom4jDemo.main()"+price);

//打印某节点的所有元素节点   打印第二本书的所有元素节点
//dom4j自动过滤空行
List elements = root.elements();  //这里的list只有两个元素,因为就两本书;这里返回的List集合里装的元素类型是Element
Element secondBookElement=(Element) elements.get(1);  //List默认类型是object,所以这里get()返回的是Object;这里要向下转型
List secondBookchild = secondBookElement.elements();
System.out.println("Dom4JDemo.main()"+secondBookchild.size());
for(int i=0;i<secondBookchild.size();++i){
      Element child = (Element)secondBookchild.get(i);
      System.out.println(child.getName());
}
//修改某个节点的主题内容   把第二本书的名字改《java编程思想》
Element secondBookName=(Element)secondBookchild.get(0);
secondBookName.setText("java编程思想");  //内存中改,还没有保存到文件中
System.out.println(secondBookName.getText());

//向指定元素节点中增加子元素节点   往第一本书里增加一个销量子节点
Element addElement=firstBookelement.addElement("销量");  //这个直接增加到最后
addElement.setText("1000");
//向指定元素节点上增加同级元素节点  第二本书的 售价 之前增加一个上架分类 计算机
Element element=DocumentHelper.createElement("上架分类");  //这里区别于上面的addElement(),不能直接添加,要先创建,再在指定位置插入
element.setText("计算机");
secondBookchild.add(2, (Object)element); //这里只是插入到了List集合里,写回文件的时候才生效

//删除指定元素节点
secondBookElement.remove(element);
//操作XML文件属性
String xmlEncoding = document.getXMLEncoding();
System.out.println("Dom4JDemo.main()"+xmlEncoding);

//标准的保存语句。
//dom4j写回文档会自动写换行方便观看
OutputFormat format = OutputFormat.createPrettyPrint();   // 指定XML编码                  
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);
writer.write(document);
writer.close();
   }
}
output.xml
<?xml version="1.0" encoding="utf-8"?>
<书架>
  <书>
    <书名 id="001">浪潮之巅</书名> 
    <作者>吴军</作者> 
    <售价>29</售价> 
    <销量>1000</销量>
  </书> 
  <书>
    <书名 id="002">java编程思想</书名> 
    <作者>吴军</作者> 
    <售价>
      <第一版>29</第一版>
    </售价>
  </书>
</书架>
指定位置增加上架分类,计算机
最终控制台结果




posted on 2018-06-14 10:05  正在加载……  阅读(395)  评论(0编辑  收藏  举报