zoukankan      html  css  js  c++  java
  • Strus2第一次课:dom4j操作xml

    先从底层的xml操作技术记录:

     当我们新建一个项目,什么架包都没加入的时候,java提供了 org.w3c.dom给我们操作xml里面的元素

      import org.w3c.dom.Document;

      import org.w3c.dom.Element;

      import org.w3c.dom.Node;

      import org.w3c.dom.NodeList;

      并且提供了 javax.xml来读取xml、对xml进行增删改操作

      如何读取一个xml文件:

      导包:

    1.  javax.xml.parsers.DocumentBuilderFactory;//文本建造工厂
    2.  javax.xml.parsers.DocumentBuilder;      //文本建造者
    3. org.w3c.dom.Document;                           //文本  

      

      DocumentBuilderFactory factory=null;

      DocumentBuilder builder=null;

      Document doc=null;

      

    try {
                factory=DocumentBuilderFactory.newInstance();
                builder=factory.newDocumentBuilder();
                doc=builder.parse("练习/project1/Student2.xml");
            } catch (Exception e) {
                e.printStackTrace();
            }

    上面的代码:从工厂new一个文本建造者,由这个建造者去拿xml文件,n(*≧▽≦*)n太面向对象了!


    获取xml里面的节点,以及节点内的元素

    Element对象提供一系列的方法,可以对节点执行增、删、改、查:

    factory=DocumentBuilderFactory.newInstance();
                builder=factory.newDocumentBuilder();
                doc=builder.parse("练习/Student.xml");
                //element=build("练习/project1/Student2.xml").getDocumentElement();
           Element element=doc.getDocumentElement();
    System.out.println("-------"+element.getTagName()+"-------"); NodeList list=element.getElementsByTagName("student"); for(int i=0;i<list.getLength();i++){ for(int j=0;j<list.item(i).getChildNodes().getLength();j++){ System.out.println(((Element)list.item(i).getChildNodes().item(j)).getNodeName()+":"+((Element)list.item(i).getChildNodes().item(j)).getTextContent()); } System.out.println("--------------"); }

    上面的代码打印xml里面的节点和节点内的文本!

    element接口里面的部分方法:

    • element.getAttribute("");                   //获取节点属性的
    • element.getElementsByTagName("");  //根据节点名或者节点列表 NodeList
    • element.getChildNodes()、element.getFirstNode()、element.getNextSibling()、element.getLastNode()     见名知意:
    • element.getTagName().....                 //获取节点名字

    方法很多,不一一介绍,上面的代码中有体现!


    需要注意的是:以上方法都是在内存中执行的,也就是在本地拿到东西后放在内存里面,下面我们来了解增删改时,对于多出来的操作就不觉得奇怪的

    新增节点:

    新增节点使用document.createElement("")方法:

    //在内存中对xml新增节点:仅是在内存中
                element=build("练习/project1/Student2.xml").getDocumentElement();
                Element creELe=doc.createElement("student");
                Element stuno=doc.createElement("stuno");
                Element stuname=doc.createElement("stuname");
                stuname.setTextContent("大头");
                Element stuage=doc.createElement("stuage");
                stuage.setTextContent("20");
                Element stuinfo=doc.createElement("stuinfo");
                stuinfo.setTextContent("我的特点就是头特别大!");
                stuno.setAttribute("id","2");
                creELe.appendChild(stuno);
                creELe.appendChild(stuname);
                creELe.appendChild(stuage);
                creELe.appendChild(stuinfo);
                element.appendChild(creELe);

    以上操作皆是内存里面的操作,要将节点保存还需要持久化:

    • import javax.xml.transform.Result;
      import javax.xml.transform.Source;
      import javax.xml.transform.Transformer;
      import javax.xml.transform.TransformerFactory;

    TransformerFactory tfactory=TransformerFactory.newInstance();
                Transformer trans=tfactory.newTransformer();
                //源    位置
                Source source=new DOMSource(doc);
                Result result=new StreamResult(path);
                trans.transform(source, result);

    n(*≧▽≦*)n也是面向对象!

    友情提示:

    在添加节点的时候大家一定注意节点之间的关系,在持久化操作的时候,source对象里面应该设置document对象,别设置成element对象

    现在是初步学习,没遇到什么错,我相信在后面的学习中会遇到更多问题,到时候补充

      

    删除、修改:

       与新增操作雷同,最后一定要"trans.transform(source, result)"

      不然你之前的代码就都白费了!

     

    下面是重头戏dom4j:


      dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

      

      友情提示:

      了解了底层的xml操作,dom4j操作就直接上代码,原理其实一样的。里面的方法名会有些区别,看看帮助文档都可以解决

      需要下载dom4j架包:

        官网地址:http://sourceforge.net/projects/dom4j/files/

      导入:import org.dom4j.*;

      

    •   
    public List sele(String path) throws Exception{
            Element element=CreateUtil.reElement(path);
            System.out.println("总共有:"+element.nodeCount()+"个元素");
            list=new ArrayList();
            //map=new HashMap();
            return forhelper(element);
        }
    /**
         * 循环遍历并且返回list
         * @param ele
         * @return
         */
        public List forhelper(Element ele){
            
            for(Iterator ite2=ele.elementIterator();ite2.hasNext();){
                Element ele2=(Element)ite2.next();
                //System.out.println(ele2.getName()+":"+ele2.getText());
                String word=ele2.getName()+":"+ele2.getText();
                list.add(word);
                if(ele2.nodeCount()>0){
                    forhelper(ele2);
                    
                }
                
            }
            return list;
            
        }

     

    /**
         * 保存指定的document对象,指定将要存储的位置,gotopath=null时默认存储在打开的位置
         * @param path
         * @param dom
         * @param goToPath
         * @return
         * @throws Exception
         */
        public boolean save(String goToPath) throws Exception{
            //创建document
            Document dom=DocumentHelper.createDocument();
            //创建根节点
            
            Element eleRoot=dom.addElement("Student");
            Element ele=eleRoot.addElement("stuno").addText("1");
            Element ele2=eleRoot.addElement("stuname").addText("李四");
            last(dom, goToPath);
            return false;
        }

     

    /**
         * 改变文本内容
         * @param path
         * @param goToPath
         * @return
         * @throws Exception
         */
        public boolean reEle(String path,String goToPath) throws Exception{
            Document dom=CreateUtil.redom(path);
            Element element= dom.getRootElement();
            System.out.println(element.getName());
            Element ele=element.element("stuname");
            System.out.println(ele.asXML());
            ele.setText("改变了"); 
            last(dom, goToPath);
            return false;
        }

     

    /**
         * 删除制定的节点,或者节点内元素
         * @param path
         * @return
         * @throws Exception
         */
        public boolean del(String path,String elename) throws Exception{
            Document dom=CreateUtil.redom(path);
            Element element= dom.getRootElement();
            System.out.println(element.getName());
            Element ele=element.element(elename);
            if(ele!=null){
                System.out.println(ele.asXML());
                System.out.println(element.remove(ele)); 
                last(dom, path);
            }else{
                System.out.println("没有你要查找的节点!");
            }
            return false;
        }
        
    • 持久化方法

     

    /**
         * 从内存读取到本地
         * @param dom
         * @param path
         */
        public void last(Document dom,String path){
            XMLWriter xmlw=null;
            try {
                OutputFormat output=OutputFormat.createPrettyPrint();
                output.setEncoding("utf-8");
                xmlw=new XMLWriter(new FileOutputStream(new File(path)), output);
                xmlw.write(dom);
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if(xmlw!=null){
                    try {
                        xmlw.close();
                        System.out.println("操作成功!");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }

    注意::

      dom4j在持久化操作时会有乱码的现象!

      小窍门:

      酱紫持久化就不会出现乱码了!

     OutputFormat output=OutputFormat.createPrettyPrint();
                output.setEncoding("utf-8");
                xmlw=new XMLWriter(new FileOutputStream(new File(path)), output);
           
    xmlw.write(dom);
     

      

      代码不一定合理,请不要照搬!

     

  • 相关阅读:
    2014年去哪儿网笔试题--一个10*10的矩阵(可以理解为棋盘),随时生成一组数据填入矩阵,任何一个位置的数字除4进行计算,按余数着色...
    2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。
    剑指Offer:面试题25
    字符串模式匹配KMP算法
    堆排序算法原理
    HashMap和HashTable 学习
    JAVA的IO学习
    输出图片的php代码前面不能有空白行
    PHP中最容易忘记的一些知识点总结
    PHP中cookie与session总结
  • 原文地址:https://www.cnblogs.com/gcs1995/p/4204578.html
Copyright © 2011-2022 走看看