xml的解析DOM,SAX,DOM4J(含之間的區別)

xml的解析DOM,SAX,DOM4J

分類: web

Dom和sax解析區別:

1.dom:(Document Object Model,文檔對象模型) W3C組織推薦的一種處理方式

 sax:(Simple API for XML)不是官方標準,但它是XML社區事實上的標準,幾乎所有的XML解析

器都支持它。

2.使用Dom解析XML文檔時,需要讀取整個XML文檔,在內存中架構架構代表整個DOM樹的Document

對象,從而再對XML文檔進行操作。在此種情況下,如果xml文檔特別大,就會消耗計算機的大量

內存,並且容易導致內存溢出。

  SAX解析允許在操作讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔加載完纔會對

文檔進行操作。

------------SAX解析----------

SAX解析思想:解析器和事件處理器

1.解析器可以使用JAXP的API創建,創建出SAX解析器後,就可以指定解析器去解析某個XML文檔

2.解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會調用

事件處理器的一個方法,解析器在調用事件處理器的方法時,就把當前解析到的xml的文件內容

作爲參數,傳遞給事件處理器。

3.程序員編寫事件處理器,通過事件處理器中方法的參數,得到解析的數據,對數據進行操作。

eg:

                 //1.創建解析工廠對象

          SAXParserFactory  factory=SAXParserFactory.newInstance();

               //2.用工廠對象產生解析器對象

          SAXParser parser= factory.newSAXParser();

              //3.用解析器對象得到一個讀取器對象

         XMLReader xmlReader=parser.getXMLReader();

              //4.給讀取器設置一個處理器

         xmlReader.setContentHandler(newMyContentHandler() );

              //用解析器去讀取book.xml

        xmlReader.parse("src\\cn\\itcast\\day02\\book.xml");

其中MyContentHandle繼承製DefaultHandler類,覆寫需要的方法:

1.startDocument()

2.endDocument()

3.startElemnet()

4.endElment();

5.characters();

其中得到屬性的方法:

 attributes.getValue("方法名");

注:sax只能用於讀取xml文件,無法作更新

------------Dom解析-----------------

主要的概念:

 Node:xml文件所有對象的根接口  節點

 Document:代表xml文件的整個內容的對象的接口

 Element:代表某個元素或標籤的對象的接口

 Attr:代表某個元素的某個屬性對象的接口

 Text:代表標籤體文本內容對象的接口

 

 NodeList:代表包含多個Node接口對象的集合對象

 

可以對標籤進行增(create)刪(Delete)改(update)查(read)----CRUD

       讀:查看所有的數據 有條件的查詢數據 

       寫入:將一個User對象的信息保存爲一個user標籤

       更新:創建一個有數據的user對象,根據其中的某個屬性數據值去找對應的user標籤,

將user對象的數據放到此user標籤中

       刪除:刪除所有user標籤,有條件的刪除:id=2刪除對應的user標籤

操作的基本步驟:

1.加載xml文件得到Document()

Document document = getDocument();

2.得到根標籤(uers標籤)

Element usersEle =document.getDocumentElement();

3.得到跟標籤的所有子標籤(得到Users標籤的所有子標籤,返回一個NodeList)

NodeList nodeList =usersEle.getElementsByTagName("user");

4.遍歷List進行操作。

for(int i=0;i<nodeList.getLength();i++){}

常用的方法:文檔解析器工廠---->解析器對象----->用解析器解析xml文件得到Document對象

 

 private Document getDocument() throwsParserConfigurationException,

                     SAXException,IOException {

              //創建一個文檔解析器工廠對象

              DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory

                            .newInstance();

              //根據工廠對象得到解析器對象password

              DocumentBuilderbuilder = builderFactory.newDocumentBuilder();

              //用解析器解析xml文件得到Document對象

              Documentdocument = builder.parse(new File(

                            "H:\\workspace\\day01\\src\\cn\\itcast\\dom\

\users.xml"));

              returndocument;

       }

      

保存信息: 思路:轉移器工廠對象---->通過工廠得到轉移器---->通過轉移器將Document的數

據轉移到文件中去

 

             private void saveDocument(Documentdocument)

                     throwsTransformerFactoryConfigurationError,

                     TransformerConfigurationException,TransformerException {

              // 創建一個轉移器工廠對象

              TransformerFactory factory =TransformerFactory.newInstance();

              // 通過工廠對象得到一個轉移器

              Transformer transformer =factory.newTransformer();

              // 通過轉移器將Document的數據轉移到users.xml文件中去

              DOMSource xmlSource = newDOMSource(document);

              StreamResultoutputTarget = new StreamResult(new File(

                            "H:\\workspace\\day01\\src\\cn\\itcast\\dom\

\users.xml"));

              transformer.transform(xmlSource,outputTarget);

       }

 

Node       appendChild(newChild)       將新的節點添加爲最後一個子節點

       insertBefore(newChild,refChild) 在某個子節點前插入一個新子節點

       removeChild(oldChild)       刪除指定的某個子節點

       replaceChild(newChild,oldChild)       將指定的子節點替換成新的子節點

       setTextContent(textContent) 設置文本內容(一般用在元素對象上)

       getNodeName()    得到節點名稱(一般用在元素對象上)

       getParentNode()     得到父節點(一般用在元素對象上)

       getTextContent()   得到文本內容(一般用在元素對象上)

       getFirstChild()       得到第一個子節點

       getLastChild() 得到最後一個子節點

       getNextSibling()    得到下一個兄弟節點

       getPreviousSibling()      得到上一個兄弟節點

 

 

 

Document

       createElement(name)     創建一個指定名稱的標籤對象返回

       getDocumentElement()       得到xml文件根標籤

       getElementById(id)       根據id屬性值獲取一個子標籤對象

       getElementsByTagName(name)     根據標籤名得到所有對應的子標籤

Element        

       setAttribute(name,value)     設置屬性的名稱和值

       removeAttribute(attrName)   根據屬性名刪除對應的屬性值

       getAttribute(attrName)   根據屬性名得到相應的屬性值

       getElementsByTagName(name)     根據標籤名得到對應的子標籤

       getTagName() 得到標籤名

 

Attr、Text      極少直接操作這兩個接口的對象,一般通過Element對象來操作

NodeList getLength()得到包含的節點對象的個數 item(index)根據下標得到某個節點     

-------------DOM4J---------------------------

1.Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而後獨立開

發的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要複雜一些,但它提

供了比JDOM更好的靈活性。

2.Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很

多軟件採用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

3.使用Dom4j開發,需下載dom4j相應的jar文件。

 

 

DOM4j中,獲得Document對象的方式有三種:

 

       1.讀取XML文件,獲得document對象            

                   SAXReader reader = newSAXReader();
             Document  

document = reader.read(new File("input.xml“ ));

 

       2.解析XML形式的文本,得到document對象.

                 String text = "<members></members>";
             Document

document = DocumentHelper.parseText(text);

 

       3.主動創建空document對象.

                Document document = DocumentHelper.createDocument();           

//創建根節點

                  Element root =document.addElement( "members");

 

元素Element操作:

//獲取文檔的元素.

     Element root = document.getRootElement();

//獲取某個元素的指定名稱的第一個子節點.

       Elementelement = element.element(“書名");

//獲取某個元素的指定名稱的所有子元素的集合

     List list = element.elements(“書名”);

//添加一個指定名稱的子元素

     Element childEle = parentEle.addElement(“書名”);

//刪除某個元素指定的子元素

       parentEle.remove(childEle);

 

 

 

 

屬性Attribute操作

 

//獲取某個元素的指定名稱的屬性對象

     Attribute attr = element.attribute(“id”);

//獲取某個元素的指定名稱的屬性值

        String id = element.attributeValue(“id”);

//給元素添加屬性或更新其值

     Attribute attr =element.addAttribute(“id”,”123”);

//刪除某個元素的指定屬性

     element.remove(attribute);

 

文本Text的操作

//獲取某個元素的文本內容

     String text = element.getText();

//給某個元素添加或更新文本內容

        element.setText(“Tom”);

 

 

 

將文檔寫入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(newFileWriter( "output.xml“

),format);

                 writer.write(document);

                 writer.close();

Xpath介紹:

1.      在xml文檔中查找信息的語言

2.      通過元素和屬性進行查找

3.      簡化Dom4j查找節點的過程

4.       /students/student

5.       從根元素開始逐層找,以”/”開頭

6.       //name

7.       直接獲取所有name元素對象,以“//”開頭

8.       //student/*

9.       獲取所有student元素的所有子元素對象

10.   //student[1]或//student[last()]

11.   獲取所有student元素的第一個或最後一個

12.   //student[@id]

13.   獲取所有帶id屬性的student元素對象

14.   //student[@id=‘002']

15.   獲取id等於002的student元素對象

 

l      獲取所有符合條件的節點

•        document.selectNodes(StringxpathExpression)

       返回List集合

l      獲取符合條件的單個節點

•        document.selectSingleNode(StringxpathExpression)

•        返回一個Node對象。     

•        如果符合條件的節點有多個,那麼返回第一個。

Eg:

publicvoid testGetPriceByName() throws Exception {

           // 加載xml文件

            Document document = getDocument();

           String xpath="//[@書名='JavaScript網頁開發']/售價";

          List<Node> nodes=     document.selectNodes(xpath);

          for(Node node:nodes){

               if(node.getName().equals("售價")){

                    System.out.println(node.getText());}

          }  }

轉自:http://blog.csdn.net/wd916913/article/details/8088033


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章