兩種解析XML文檔的方法---DOM和SAX

 

 

 

兩種解析XML文檔的方法---DOM和SAX

DOM方式解析XML文件

DOC解析編程:

查找某一個節點

       // 查找固定值的書的元素的第二個子節點

    public static void findFixedChildren(Document doc) {

       //通過名字查找並返回一個集合

       NodeList list = doc.getElementsByTagName("書名");

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

           //通過Item()方法返回集合中的第i項

           Node n = list.item(i);

           System.out.println(n.getNodeName());

       }

//查找書架中的子元素的第二個元素

       int index = 2;

//獲取集合中的長度並判斷,如果長度》2,說明有要找的那個元素,然後找出並輸出

       if (list.getLength() >= 2) {

           Node bookname = list.item(index);

           System.out.println(bookname.getNodeName() +bookname.getNodeType()+ bookname.getNodeValue());

       }

刪除結點

       // 刪除節點

    public static void deleteElement(Document doc) throws Exception {

       // 獲取要刪除的那個節點對象

       Node node = doc.getElementsByTagName("售價").item(1);

       //getParentNode()是此節點的父節點

       //removeChild() 從子節點列表中移除 oldChild 所指示的子節點,並將其返回。

       node.getParentNode().removeChild(node);// removeChild

 

       // 將內存中樹狀結構doc'寫入到xml文檔中

       TransformerFactory factory = TransformerFactory.newInstance();

       // 由工廠對象生成裝換對象Transformer

       Transformer trans = factory.newTransformer();

    // 通過trans實現doc轉換到xml文檔,用的此方法中的參數是(Source,Result),必須用此方法的實現了改接口的類纔可以用,DOMSource實現了Suorce

       // 需要一個DOMSource對象來代表源樹

       trans.transform(new DOMSource(doc), new StreamResult(new File(

              "src/Book.xml")));

}

注意:將內存中樹狀結構doc'寫入到xml文檔中,在其中,當調用transform方法時,有兩個參數,分別爲 Source和Resutl,但這兩個數是接口,但必須在用的時候,要用實現了該接口的類纔可以,所以用到了DOMSource 和StreamResult兩個方法

    TransformerFactory factory = TransformerFactory.newInstance()

       Transformer trans = factory.newTransformer();

       trans.transform(new DOMSource(doc), new StreamResult(new File(

              "src/Book.xml")));

 

             

添加節點

              // 節點的添加

    public static void createElement(Document doc) throws Exception {

       // 確定添加節點 的位置,得到的是集合是父節點,通過標籤名找,返回的是集合,要確定是哪個節點

       Node book = doc.getElementsByTagName("書").item(0);

       // 生成一個新節點

       Element element = doc.createElement("出版社");

       // element.setTextContent("清華大學");

       Text text = doc.createTextNode("清華大學出版社");

        element.appendChild(text);

       // 在指定 的位置把新生成的節點添加進去

        book.appendChild(element);

 

       // 將內存中樹狀結構doc'寫入到xml文檔中

       TransformerFactory factory = TransformerFactory.newInstance();

       // 由工廠對象生成裝換對象Transformer

       Transformer trans = factory.newTransformer();

       // 通過trans實現doc轉換到xml文檔,用的此方法中的參數是(Source,Result),必須用此方法的實現了改接口的類纔可以用,DOMSource實現了Suorce

       // 需要一個DOMSource對象來代表源樹

       trans.transform(new DOMSource(doc), new StreamResult(new File(

              "src/Book.xml")));

    }

插入節點

public static void createFileElement(Document doc) throws Exception {

       // 確定插入點的位置

       Node author = doc.getElementsByTagName("作者").item(0);

       Node parent = author.getParentNode();// 指定插入到作者之前

 

       //插入到author的後面

       Node brothder = author.getNextSibling();

       // 創建新節點

       Element element = doc.createElement("出版社");

       element.setTextContent("清華大學出版社");

 

       // 插入節點,在書這個節點中在作者前插入

       // parent.insertBefore(element, author);//()

       parent.insertBefore(element, brothder);

       // 將內存中樹狀結構doc'寫入到xml文檔中

       TransformerFactory factory = TransformerFactory.newInstance();

       // 由工廠對象生成裝換對象Transformer

       Transformer trans = factory.newTransformer();

       // 通過trans實現doc轉換到xml文檔,用的此方法中的參數是(Source,Result),必須用此方法的實現了改接口的類纔可以用,DOMSource實現了Suorce

       // 需要一個DOMSource對象來代表源樹

       trans.transform(new DOMSource(doc), new StreamResult(new File(

              "src/Book.xml")));

    }

修改節點

public static void updateElement(Document doc) throws Exception {

       // 獲取要更新的對象

       Node node = doc.getElementsByTagName("售價").item(0);

       node.setTextContent("500");

       // 修改屬性

       if (node instanceof Element) {

           Element element = (Element) node;

           Attr att = element.getAttributeNode("type");

           att.setValue("美元");

       }

 

       // 將內存中樹狀結構doc'寫入到xml文檔中

       TransformerFactory factory = TransformerFactory.newInstance();

       // 由工廠對象生成裝換對象Transformer

       Transformer trans = factory.newTransformer();

       // 通過trans實現doc轉換到xml文檔,用的此方法中的參數是(Source,Result),必須用此方法的實現了改接口的類纔可以用,DOMSource實現了Suorce

       // 需要一個DOMSource對象來代表源樹

       trans.transform(new DOMSource(doc), new StreamResult(new File(

              "src/Book.xml")));

    }

Node方法的總結:

(1)node.getNodeType()   得到的是節點的類型     元素節點類型是1   文本節點爲 3

(2)node.getNodeValue()     元素的值爲空  因爲節點是Element,所有返回的是null

(3)得到元素中的內容的方法:

node.getTextContent()  

Text  text =  (Text)node.getChildNoddes().item(0)     Text.getNodeValues()  

  

SAM解析xml文檔

(1)SAM解析的優點:

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

(2)SAM解析的分析:

        SAX採用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器和事件處理器:

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

•         解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容作爲方法的參數傳遞給事件處理器。

•         事件處理器由程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕鬆地得到sax解析器解析到的數據,從而可以決定如何對數據進行處理。

(3)SAM解析的步驟:

              //獲取SAX解析器工廠類的對象

       SAXParserFactory factory = SAXParserFactory.newInstance();

       //獲取Sax解析器

       SAXParser sax = factory.newSAXParser();

       //通過解析器解析xml文檔

//BookHandler事件處理器

sax.parse(new File("src/Book.xml"),new BookHandler());

 

BookHandler是事件處理器,要想調用必須要重寫DefaultHandler中的方法來實現功能,

class BookHandler extends DefaultHandler{

    private boolean flag = false;

    @Override

    //標籤體的內容的解析的方法

    public void characters(char[] ch, int start, int length) throws SAXException {

       // TODO Auto-generated method stub

       super.characters(ch, start, length);

       if(flag = true){

           System.out.println("元素的內容爲:"+new String(ch,start,length));

       }

       //flag = false;

    }

 

    @Override

    //文檔結束時調用的方法

    public void endDocument() throws SAXException {

       // TODO Auto-generated method stub

       super.endDocument();

       System.out.println("xml文檔的結束");

    }

 

    @Override

    //結束時調用的元素

    public void endElement(String uri, String locaName, String qName)

           throws SAXException {

       // TODO Auto-generated method stub

       super.endElement(uri, locaName, qName);

       //System.out.println("元素的結束:"+qName);

       if(qName.equals("書")){

           flag = false;

       }

    }

 

    @Override

    public void startDocument() throws SAXException {

       // TODO Auto-generated method stub

       super.startDocument();

       System.out.println("xml文檔的開始");

    }

 

    @Override

    public void startElement(String uri, String locaName, String qName,

           Attributes attributes) throws SAXException {

       // TODO Auto-generated method stub

       super.startElement(uri, locaName, qName, attributes);

    //  System.out.println("元素的開啓:"+qName);

       if(qName.equals("書")){

           System.out.println("元素的開啓:"+qName);

           flag = true;

       }

    }

}

·

 

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