程式設計之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