dream.in.java

          能以不變應萬變是聰明人做事的準則。萬事從小事做起,積累小成功,問鼎大成功,是成功者的秘訣。

          JAVA解析XML的四種方法比較

          XML現在已經成為一種通用的數據交換格式,它的平臺無關性,語言無關性,系統無關性,給數據集成與交互帶來了極大的方便。對于XML本身的語法知識與技術細節,需要閱讀相關的技術文獻,這里面包括的內容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具體可參閱w3c官方網站文檔http://www.w3.org獲取更多信息。

                  XML在不同的語言里解析方式都是一樣的,只不過實現的語法不同而已。基本的解析方式有兩種,一種叫SAX,另一種叫DOM。SAX是基于事件流的解析,DOM是基于XML文檔樹結構的解析。假設我們XML的內容和結構如下:

          <?xml version=”1.0″ encoding=”UTF-8″?> 
          <employees>
            <employee>
              <name>ddviplinux</name>
              <sex>m</sex>
              <age>30</age>
            </employee>
          </employees>

          本文使用JAVA語言來實現DOM與SAX的XML文檔生成與解析。

          首先定義一個操作XML文檔的接口XmlDocument 它定義了XML文檔的建立與解析的接口。

          package com.alisoft.facepay.framework.bean;

           

          /**

           

           *

           

           * @author hongliang.dinghl

           

           * 定義XML文檔建立與解析的接口

           

           */

           

          public interface XmlDocument {

           

          /**

           

           * 建立XML文檔

           

           * @param fileName 文件全路徑名稱

           

           */

           

          public void createXml(String fileName);

           

          /**

           

           * 解析XML文檔

           

           * @param fileName 文件全路徑名稱

           

           */

           

          public void parserXml(String fileName);

           

          }

           

          1. DOM生成和解析XML文檔

                  為 XML 文檔的已解析版本定義了一組接口。解析器讀入整個文檔,然后構建一個駐留內存的樹結構,然后代碼就可以使用 DOM 接口來操作這個樹結構。優點:整個文檔樹在內存中,便于操作;支持刪除、修改、重新排列等多種功能;缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;使用場合:一旦解析了文檔還需多次訪問這些數據;硬件資源充足(內存、CPU)。

          package com.alisoft.facepay.framework.bean;

           

          import java.io.FileInputStream;

           

          import java.io.FileNotFoundException;

           

          import java.io.FileOutputStream;

           

          import java.io.IOException;

           

          import java.io.InputStream;

           

          import java.io.PrintWriter;

           

          import javax.xml.parsers.DocumentBuilder;

           

          import javax.xml.parsers.DocumentBuilderFactory;

           

          import javax.xml.parsers.ParserConfigurationException;

           

          import javax.xml.transform.OutputKeys;

           

          import javax.xml.transform.Transformer;

           

          import javax.xml.transform.TransformerConfigurationException;

           

          import javax.xml.transform.TransformerException;

           

          import javax.xml.transform.TransformerFactory;

           

          import javax.xml.transform.dom.DOMSource;

           

          import javax.xml.transform.stream.StreamResult;

           

          import org.w3c.dom.Document;

           

          import org.w3c.dom.Element;

           

          import org.w3c.dom.Node;

           

          import org.w3c.dom.NodeList;

           

          import org.xml.sax.SAXException;

           

          /**

           

           *

           

           * @author hongliang.dinghl

           

           * DOM生成與解析XML文檔

           

           */

           

          public class DomDemo implements XmlDocument {

           

             

           

              private Document document;

           

           

           

              private String fileName;

           

           

           

              public void init() {

           

                 try {

           

                     DocumentBuilderFactory factory = DocumentBuilderFactory

           

                            .newInstance();

           

                     DocumentBuilder builder = factory.newDocumentBuilder();

           

                     this.document = builder.newDocument();

           

                 } catch (ParserConfigurationException e) {

           

                     System.out.println(e.getMessage());

           

                 }

           

              }

           

           

           

              public void createXml(String fileName) {

           

           

           

                 Element root = this.document.createElement(“employees”);

           

                 this.document.appendChild(root);

           

                 Element employee = this.document.createElement(“employee”);

           

                 Element name = this.document.createElement(“name”);

           

                 name.appendChild(this.document.createTextNode(“丁宏亮“));

           

                 employee.appendChild(name);

           

                 Element sex = this.document.createElement(“sex”);

           

                 sex.appendChild(this.document.createTextNode(“m”));

           

                 employee.appendChild(sex);

           

                 Element age = this.document.createElement(“age”);

           

                 age.appendChild(this.document.createTextNode(“30″));

           

                 employee.appendChild(age);

           

                 root.appendChild(employee);

           

           

           

                 TransformerFactory tf = TransformerFactory.newInstance();

           

                 try {

           

                     Transformer transformer = tf.newTransformer();

           

                     DOMSource source = new DOMSource(document);

           

                     transformer.setOutputProperty(OutputKeys.ENCODING, “gb2312″);

           

                     transformer.setOutputProperty(OutputKeys.INDENT, “yes”);

           

                     PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));

           

                     StreamResult result = new StreamResult(pw);

           

                     transformer.transform(source, result);

           

                     System.out.println(“生成XML文件成功!”);

           

                 } catch (TransformerConfigurationException e) {

           

           

           

                     System.out.println(e.getMessage());

           

                 } catch (IllegalArgumentException e) {

           

           

           

                     System.out.println(e.getMessage());

           

                 } catch (FileNotFoundException e) {

           

           

           

                     System.out.println(e.getMessage());

           

                 } catch (TransformerException e) {

           

           

           

                     System.out.println(e.getMessage());

           

                 }

           

           

           

              }

           

           

           

              public void parserXml(String fileName) {

           

                 try {

           

                     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

           

                     DocumentBuilder db = dbf.newDocumentBuilder();

           

                     Document document = db.parse(fileName);

           

                     NodeList employees = document.getChildNodes();

           

                     for (int i = 0; i < employees.getLength(); i++) {

           

                        Node employee = employees.item(i);

           

                        NodeList employeeInfo = employee.getChildNodes();

           

                        for (int j = 0; j < employeeInfo.getLength(); j++) {

           

                            Node node = employeeInfo.item(j);

           

                            NodeList employeeMeta = node.getChildNodes();

           

                            for (int k = 0; k < employeeMeta.getLength(); k++) {

           

                               System.out.println(employeeMeta.item(k).getNodeName()

           

                                      + “:” + employeeMeta.item(k).getTextContent());

           

                            }

           

                        }

           

                     }

           

                     System.out.println(“解析完畢“);

           

                 } catch (FileNotFoundException e) {

           

                     System.out.println(e.getMessage());

           

                 } catch (ParserConfigurationException e) {

           

                     System.out.println(e.getMessage());

           

                 } catch (SAXException e) {

           

                     System.out.println(e.getMessage());

           

                 } catch (IOException e) {

           

                     System.out.println(e.getMessage());

           

                 }

           

               }

           

          }

           

          2. SAX生成和解析XML文檔

                  為解決DOM的問題,出現了SAX。SAX ,事件驅動。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,占用資源少;SAX解析器代碼比DOM解析器代碼小,適于Applet,下載。缺點:不是持久的;事件過后,若沒保存數據,那么數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬于哪個元素;使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少;

          package com.alisoft.facepay.framework.bean;

           

          import java.io.FileInputStream;

           

          import java.io.FileNotFoundException;

           

          import java.io.IOException;

           

          import java.io.InputStream;

           

          import javax.xml.parsers.ParserConfigurationException;

           

          import javax.xml.parsers.SAXParser;

           

          import javax.xml.parsers.SAXParserFactory;

           

          import org.xml.sax.Attributes;

           

          import org.xml.sax.SAXException;

           

          import org.xml.sax.helpers.DefaultHandler;

           

          /**

           

           *

           

           * @author hongliang.dinghl

           

           * SAX文檔解析

           

           */

           

          public class SaxDemo implements XmlDocument {

           

           

           

              public void createXml(String fileName) {

           

                  System.out.println(“<<”+filename+“>>”);

           

              }

           

           

           

              public void parserXml(String fileName) {

           

                 SAXParserFactory saxfac = SAXParserFactory.newInstance();

           

           

           

                 try {

           

           

           

                     SAXParser saxparser = saxfac.newSAXParser();

           

           

           

                     InputStream is = new FileInputStream(fileName);

           

           

           

                     saxparser.parse(is, new MySAXHandler());

           

           

           

                 } catch (ParserConfigurationException e) {

           

           

           

                     e.printStackTrace();

           

           

           

                 } catch (SAXException e) {

           

           

           

                     e.printStackTrace();

           

           

           

                 } catch (FileNotFoundException e) {

           

           

           

                     e.printStackTrace();

           

           

           

                 } catch (IOException e) {

           

           

           

                     e.printStackTrace();

           

           

           

                 }

           

           

           

              }

           

           

           

          }

           

           

           

          class MySAXHandler extends DefaultHandler {

           

           

           

              boolean hasAttribute = false;

           

           

           

              Attributes attributes = null;

           

           

           

              public void startDocument() throws SAXException {

           

           

           

                 System.out.println(“文檔開始打印了“);

           

           

           

              }

           

           

           

              public void endDocument() throws SAXException {

           

           

           

                 System.out.println(“文檔打印結束了“);

           

           

           

              }

           

           

           

              public void startElement(String uri, String localName, String qName,

           

           

           

              Attributes attributes) throws SAXException {

           

           

           

                 if (qName.equals(“employees”)) {

           

           

           

                     return;

           

           

           

                 }

           

           

           

                 if (qName.equals(“employee”)) {

           

           

           

                     System.out.println(qName);

           

           

           

                 }

           

           

           

                 if (attributes.getLength() > 0) {

           

           

           

                     this.attributes = attributes;

           

           

           

                     this.hasAttribute = true;

           

           

           

                 }

           

           

           

              }

           

           

           

              public void endElement(String uri, String localName, String qName)

           

           

           

              throws SAXException {

           

           

           

                 if (hasAttribute && (attributes != null)) {

           

           

           

                     for (int i = 0; i < attributes.getLength(); i++) {

           

           

           

                        System.out.println(attributes.getQName(0)

           

                               + attributes.getValue(0));

           

           

           

                     }

           

           

           

                 }

           

           

           

              }

           

           

           

              public void characters(char[] ch, int start, int length)

           

           

           

              throws SAXException {

           

           

           

                 System.out.println(new String(ch, start, length));

           

           

           

              }

           

           

           

          }

          posted on 2009-04-05 20:27 YXY 閱讀(137) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 凌海市| 宝应县| 平定县| 桓台县| 大洼县| 玉树县| 信丰县| 墨竹工卡县| 阳谷县| 廉江市| 花莲县| 黑龙江省| 曲靖市| 长武县| 彭水| 辽宁省| 连州市| 莲花县| 惠州市| 广昌县| 福清市| 古交市| 永德县| 鹤山市| 博白县| 安泽县| 隆子县| 伊川县| 凉城县| 武隆县| 泗洪县| 太白县| 新巴尔虎左旗| 互助| 孟津县| 黄梅县| 宣威市| 哈巴河县| 白城市| 龙泉市| 分宜县|