天天看點

Java之XML操作的兩種方式DOM&SAX

程式設計之XML操作

衆所周知,現階段的大型程式設計都在使用SOA架構,那就會不可避免的在多個子產品或者多個應用之間傳遞資料,但是不能保證的是各個子產品或應用是否使用同樣的平台和語言,這就需要一個能夠承載資料而與平台和語言無關的媒體,XML就是一個很好的選擇,是以熟練掌握XML的操作就顯得非常必要。

XML(Extensible Markup Language,可擴充标記語言)用于标記電子檔案使其具有結構性的标記語言,可以用來标記資料,定義資料類型,是一種允許使用者對自己的标記語言進行定義的源語言。

XML的操作分為從XML中讀取指定的對象,向XML檔案中添加對象,從XML檔案中删除指定對象,修改XML中的指定對象(類似于資料庫操作的增删改查)。XML的操作就技術上來說多種多樣的,針對于Java語言本文介紹兩種常用的方法DOM(Document Object Model)方式和SAX(Simple API for XML)方式。

XML檔案:

Mine.xml

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app>
 3     <display-name/>
 4     <welcome-file-list>
 5         <welcome-file>hello.jsp</welcome-file>
 6     </welcome-file-list>
 7       <servlet>
 8           <servlet-name>HelloServlet</servlet-name>
 9           <servlet-class>lee.HelloServlet</servlet-class>
10       </servlet>
11       <servlet-mapping>
12           <servlet-name>HelloServlet</servlet-name>
13           <url-pattern>/hello</url-pattern>
14       </servlet-mapping>
15 </web-app>      

首先我們先看一下DOM方式:

使用DOM方式解析XML的步驟:

1、  建立解析工廠

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

2、  指定DocumentBuilder

DocumentBuilder db = factory.newDocumentBuilder();

3、  從檔案構造一個Document,因為XML檔案中已經指定了便秘嗎,這裡就不必了

Document xmlDoc = db.parse(new File(“book.xml”));

通過以上三步得到Document對象後,可以通過操作該對象對XML對象操作。

DOM操作xml的一個例子

DOMApi

1 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 2 
 3         try {
 4 
 5             DocumentBuilder db = dbf.newDocumentBuilder();
 6 
 7             Document xmlDoc = db.parse(new File("src\\Mine.xml"));
 8 
 9             Element root = xmlDoc.getDocumentElement();
10 
11             Element book = xmlDoc.createElement("book");
12 
13             book.setAttribute("name", "哈利波特");
14 
15             book.setTextContent("50");
16 
17             root.appendChild(book);
18 
19             System.out.println(root);
20 
21            
22 
23             TransformerFactory tf = TransformerFactory.newInstance();
24 
25            
26 
27             DOMSource source = new DOMSource();
28 
29             source.setNode(xmlDoc);
30 
31             StreamResult sr = new StreamResult();
32 
33             sr.setOutputStream(new FileOutputStream(new File("src\\Mine.xml")));
34 
35             tf.newTransformer().transform(source,sr);
36 
37         } catch (Exception e) {
38 
39             // TODO Auto-generated catch block
40 
41             e.printStackTrace();
42 
43         }      

現在我們學習一下SAX是如何解析XML的:

SAX是基于事件的“推”模型,解析過程中會在每一個标簽開始,結束和讀取标簽内容時觸發相應的事件,我們可以在相應的事件中加入我們對XML檔案的處理邏輯就可以了。使用SAX中的XMLReader對象的setContentHandler方法設定Handler,相應的事件在Handler中觸發。

SAX解析XML的步驟:

1、  建立解析工廠:

SAXParserFactory  saxPF = SAXParserFactory.newInstance();

2、  建立XMLReader對象:

XMLReader xmlReader = saxPF.newSAXParser().getXMLReader();

3、  編寫SAXHandler類(也可以為其它名)需要繼承DefaultHandler類并重寫DefaultHandler的startDocument、endDocument、startElement、endElement和characters方法

4、  為XMLReader對象設定Handler對象

SAXHandler saxHandler = new SAXHandler();

xmlReader.setContentHandler(saxHandler);

5、  使用XMLReader對象解析XML檔案

xmlReader.parse(new InputSource(new FileInputStream(new File("src\\Mine.xml"))));

下面我們看一下SAX的例子:

SAXHandler類

SAXHandler

1 import org.xml.sax.Attributes;
 2 import org.xml.sax.SAXException;
 3 import org.xml.sax.helpers.DefaultHandler;
 4 
 5 
 6 public class SAXHandler extends DefaultHandler {
 7 
 8     @Override
 9     public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
10         super.characters(arg0, arg1, arg2);
11         System.out.println("characters---------->arg0="+arg0.toString()+"arg1="+arg1+"arg2="+arg2);
12     }
13 
14     @Override
15     public void endDocument() throws SAXException {
16         super.endDocument();
17         System.out.println("endDocument---------->");
18     }
19 
20     @Override
21     public void endElement(String arg0, String arg1, String arg2)
22             throws SAXException {
23         super.endElement(arg0, arg1, arg2);
24         System.out.println("endElement---------->arg0="+arg0+"arg1="+arg1+"arg2="+arg2);
25     }
26 
27     @Override
28     public void startDocument() throws SAXException {
29         super.startDocument();
30         System.out.println("startDocument---------->");
31     }
32 
33     @Override
34     public void startElement(String arg0, String arg1, String arg2,
35             Attributes arg3) throws SAXException {
36         super.startElement(arg0, arg1, arg2, arg3);
37         System.out.println("startElement---------->arg0="+arg0+"arg1="+arg1+"arg2="+arg2+"arg3="+arg3);
38     }
39 
40 }      

XMLDemo類

XMLDemo

1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 
 5 import javax.xml.parsers.DocumentBuilder;
 6 import javax.xml.parsers.DocumentBuilderFactory;
 7 import javax.xml.parsers.SAXParserFactory;
 8 import javax.xml.transform.TransformerFactory;
 9 import javax.xml.transform.dom.DOMSource;
10 import javax.xml.transform.stream.StreamResult;
11 
12 import org.w3c.dom.Document;
13 import org.w3c.dom.Element;
14 import org.xml.sax.InputSource;
15 import org.xml.sax.XMLReader;
16 
17 
18 public class XMLDemo {
19 
20     /**
21      * @param args
22      */
23     public static void main(String[] args) {
24         // TODO Auto-generated method stub
25         new XMLDemo().parseXMLBySAX();
26     }
27     
28     public void parseXMLBySAX(){
29         SAXParserFactory saxPF = SAXParserFactory.newInstance();
30         try {
31             XMLReader xmlReader = saxPF.newSAXParser().getXMLReader();
32             SAXHandler saxHandler = new SAXHandler();
33             xmlReader.setContentHandler(saxHandler);
34             xmlReader.parse(new InputSource(new FileInputStream(new File("src\\Mine.xml"))));
35         } catch (Exception e) {
36             // TODO Auto-generated catch block
37             e.printStackTrace();
38         }
39     }
40 }      

轉載于:https://www.cnblogs.com/leejie/archive/2012/07/31/XML.html