zoukankan      html  css  js  c++  java
  • Dom4j操作XML

    dom4j帮助文档在dom4j-1.6.1/docs/guide.html文件里面,全部是英文,但是基本上应该能看懂。

    1、  四种操作xml的方式:SAX,DOM,JDOM,DOM4J.

    2、  DOM(Document Object Model):意思是把整个xml做为一个整体对象,直接全部放到内存里面,不管xml文件有多大;

    3、  SAX=Sample API for XML:假如xml文件有2G,用第一种方式,是很困难的,SAX用的是一种类似流媒体方式进行的。

    DOM和SAX是Java的API,处理xml文件的时候,相对来说是比较困难的,于是出现了下面两种框架,包装了上面两个框架。

    4、  JDOM:

    5、  DOM4J:

    6、  利用DOM4J解析xml文件(读取所有的属性节点)。

    Document可以理解为整个文档对象

    取root节点。Document.getRootElement()返回的是一个Element(元素)

    7、  理解运用xpath,path就是路径,xpath在xml文件里面找到特定的节点。

    Document.selectNodes(“//hibernate-mapping/class/property”)  //其中hibenate-mapping是根节点。做变org.dom4j.Node对象返回的。

    Document.selectSingleNodes(“//hibernate-mapping/class/property”)//只拿第一个。

    基中@name是property的属性名valueOf是拿出name的值;

    需要加入DOM4J里面的jaxen包

    8、  DOM4J的生成xml文件

    9、  用FileWriter生成xml文件的时候,可能没有格式,可以用XMLWriter类,这样自动进行美化。

    10、  DOM4J修改xml文件;很少用。

    11、  自动生成代码往往用的是:freemarker或velocity,这是常用的。用dom4j生成也很少用。

    12、  怎么用表里面的结构生成xml文件。

    13、 JavaDB

    a)       Properties对象:可以理解为一个表格对应key,value

    14、  Databasemetadata,可以能过这个JDK类,读取数据库的表结构,通过这个表结构做一些自己的事情。(熟悉用法)通过JDK文档和google学习

    15、   元数据就是数据的数据,用来描述数据的数据。

    16、   DWR,对Ajax框架封住得比较好,是类和java的结合。

    <?xml version="1.0" encoding="UTF-8"?>
    <node> 
      <book> 
        <title>JAVA编程思想</title>  
        <author>XX</author>  
        <price>12.5</price> 
      </book>  
      <book bookid="isbsb-111"> 
        <title>Effective Java</title>  
        <author>Jack</author>  
        <price>22.5</price>  
        <批发价>18</批发价> 
      </book>  
    </node>

    demo:

    package com.itheima.dom4j.test;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.junit.Test;
    
    import com.itheima.utils.Dom4jUtil;
    
    /*
     * 1、得到某个具体的节点内容
    2、遍历所有元素节点
    3、修改某个元素节点的主体内容
    4、向指定元素节点中增加子元素节点
    5、向指定元素节点上增加同级元素节点
    6、删除指定元素节点
    7、操作XML文件属性
    
    Element root =document.getRootElement();//得到根结点
    root.nodeCount();//根结点下,子结点个数
    ele.node(i);//第i个结点
    authorEle.getText();取结点的文本
    elements("书");所有的书结点
    element("作者");得到一个作者
     */
    public class Dom4jTest {
    
        // 1、得到某个具体的节点内容                在第二本书的作者
        @Test
        public void test1(){
            try {
                //1.得到Document对象
                Document document = Dom4jUtil.getDocument();
                //2.得到根结点
                //Element root =  document.getRootElement();
                //3.找第二本书
                //Element node = (Element)root.elements("书").get(1);
                //4再找第二本书的作者
                //Element authorEle = node.element("作者");
                
                
                //----------xpath--------------
                Node authorEle = document.selectSingleNode("//书[2]/作者");
                
                
                //5.读取文本
                System.out.println(authorEle.getText());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        
        //2、遍历所有元素节点
        @Test
        public void test2(){
            try {
                //1.得到Document对象
                Document document = Dom4jUtil.getDocument();
                //2.得到根结点
                Element root =  document.getRootElement();
                
                //3.调用
                treeWalk(root);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public void treeWalk(Element ele){
            System.out.println(ele.getName());
            for(int i=0;i<ele.nodeCount();i++){
                Node node = ele.node(i);//第i个结点
                if(node instanceof Element){
                    treeWalk((Element)node);
                }
            }
        }
        
        
        //3、修改某个元素节点的主体内容   第一本书的作者改为于磊
        @Test
        public void test3(){
            try {
                //1.得到Document对象
                Document document = Dom4jUtil.getDocument();
                //2.得到根结点
                //Element root =  document.getRootElement();
                //Element bookEle = root.element("书");//找到第一本书
                
                //3.找到第一本书的作者
                //Element authorEle = bookEle.element("作者");
                //authorEle.setText("于磊");
    
                //----------------xpath------------------------
                Node node = document.selectSingleNode("/书架/书[1]/作者");
                node.setText("于总");
                //4.写回XML
                Dom4jUtil.writeDocument2Xml(document);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        //4、向指定元素节点中增加子元素节点  在第二本书的子结点中添加一个批发价
        @Test
        public void test4(){
            try {
                //1.得到Document对象
                Document document = Dom4jUtil.getDocument();
                //2.得到根结点
                //Element root =  document.getRootElement();
                
                //3.找到第二本书
                //Element bookEle = (Element)root.elements().get(1);
                //bookEle.addElement("批发价").setText("80");
                
                //-------------xpath---------------------------
                Element node = (Element)document.selectSingleNode("/书架/书[2]");
                node.addElement("批发价").setText("80");
            
                //4.写回XML
                Dom4jUtil.writeDocument2Xml(document);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        //5、向指定元素节点上增加同级元素节点  在第一本书的售价前面,添加一个内部价
        @Test
        public void test5(){
            try {
                //1.得到Document对象
                Document document = Dom4jUtil.getDocument();
                //2.得到根结点
                Element root =  document.getRootElement();
                
                Element bookEle = root.element("书");
                //Element priceEle = bookEle.element("售价");
                //通过DocumentHelper类提供的createElement()创建一个结点
                Element innerPriceNode = DocumentHelper.createElement("内部价");
                innerPriceNode.setText("200");
                bookEle.elements().add(2, innerPriceNode);
            
                //4.写回XML
                Dom4jUtil.writeDocument2Xml(document);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        //6、删除指定元素节点  删除第一本书的内部价结点
        @Test
        public void test6(){
            try {
                //1.得到Document对象
                Document document = Dom4jUtil.getDocument();
                //2.得到根结点
                Element root =  document.getRootElement();
                //找到第一本书
                Element bookEle = root.element("书");
                Element innerPriceEle = bookEle.element("内部价");
                bookEle.remove(innerPriceEle);//删除子结点
                
                //4.写回XML
                Dom4jUtil.writeDocument2Xml(document);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        //7、操作XML文件属性  在第二本书的书结点中,添加一个bookid属性
        @Test
        public void test7(){
            try {
                //1.得到Document对象
                Document document = Dom4jUtil.getDocument();
                //2.得到根结点
                Element root =  document.getRootElement();
                
                //3找到第二本书的书结点
                Element secondBookEle = (Element)root.elements("书").get(1);
                
                //4.设置属性
                secondBookEle.addAttribute("bookid", "isbsb-111");
                
                //取属性值
                //String sbstr = secondBookEle.attributeValue("bookid");
                //System.out.println(sbstr);
                
                //4.写回XML
                Dom4jUtil.writeDocument2Xml(document);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    骑行封龙山
    静夜
    骑行伏羲台
    我?
    生活挺好
    多事之秋,大家注意安全
    看不到啊看不到
    个人时间管理
    给DataGrid设置中文列名
    食用油是那么让人又爱又恨!
  • 原文地址:https://www.cnblogs.com/xiarongjin/p/8310836.html
Copyright © 2011-2022 走看看