青木求鱼——leejie
我要强大到没有任何事物能够打扰到我内心地平静。
I want to be strong enough that no thing can disturb the tranquility of my heart.

程序设计之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 }
posted on 2012-07-31 01:47  leejie1001  阅读(294)  评论(0编辑  收藏  举报