程序设计之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