zoukankan      html  css  js  c++  java
  • XML解析之DOM4J

    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</第一版>
        </售价>
      </书>
    </书架>
    指定位置增加上架分类,计算机
    最终控制台结果




  • 相关阅读:
    Codeforces 1325D
    Codeforces 1325C
    Codeforces 1311F
    Codeforces 1311E
    Codeforces 1311D
    Codeforces 1316C
    JVM调试常用命令——jstack命令与线程状态(4)
    JVM调试常用命令——jstack命令与线程状态(3)
    JVM调试常用命令——jstack命令与Java线程栈(2)
    Java中类的比较与排序方法(应用Comparable接口与Comparator接口)
  • 原文地址:https://www.cnblogs.com/meihao1203/p/9181716.html
Copyright © 2011-2022 走看看