文章出處

先從底層的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);
 

  

  代碼不一定合理,請不要照搬!

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()