程序设计之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文件:
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的一个例子
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类
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类
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 }