Java對XML文件的解析

XML簡介

圍繞XML涉及到四方面的技術:

1、數據定義SchemaDTD

2、數據解析DOMSAX兩種解析模型

3、樣式風格XSTL,使用XSTL可以將XML文件中存放的內容按照指定的樣式顯示爲HTML頁面

4、實現語言JAVA,NET,JavaScript等,幾乎所有的程序語言都提供支持。所有操作XML的功能都有額外的語言提供。另Java中可以使用SAXJDOMdom4jAPI操作XML數據。

基本語法:

聲明 <?xml version=”1.0” encoding=”UTF-8”?>

XML聲明不屬於xml元素,所以不需要結束標記。

XML文檔只有一個根元素,必須包含一個單獨的標記來定義整個文檔。

XML是大小寫敏感的。

轉移字符:當某個節點的數據包含大量需要轉義的字符時,可以使用CDATA

<![CDATA[ 開始,以 ]]> 結束,其所包含的文本都會被當做普通文本處理,所有的特殊符號都會被忽略掉。但其中不能再包含CDATA,注意標籤不能有空格。


XML解析

DOM解析

   DOM解析(Document Object Mode)是一種基於對象的API,它把XML的內容加載到內存中,生成一個與XML文檔內容對應的對象模型。當解析完成時,內存中會生成與XML文檔的結構對應的DOM對象樹。這樣便能夠根據樹的結構,以節點形式來對文檔進行操作。

特點:對於小的XML文件這樣處理很方便,但遇到大的XML文件時,DOM解析佔用內存比較大,而且查找速度比較慢。

通過以下三個步驟創建XML文件對應的Document對象:

DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder =builderFactory.newDocumentBuilder();

Document document = builder.parse(file);

其他方法可參考JDKjavax.xml.*; org.w3c.dom.


   SAX解析

SAX解析器對XML文檔解析會從XML文檔開始位置起進行解析,同時根據已經定義好的事件處理器,來決定當前所解析的部分(元素、屬性或元素內容)是否有必要記錄並存儲。

特點:效率比DOM解析優越。

SAX解析是事件驅動的,需要定義一個事件監聽對象(可繼承DefaultHandler類)

通過如下三個步驟建立XML解析對象:

      SAXParserFactory factory = SAXParserFactory.newInstance();

      SAXParser parser = factory.newSAXParser();

      parser.parse(new File(""), new DefaultHandler());

其他具體方法可參考JDKorg.xml.sax.*; javax.xml.parsers.

DOMSAX都是JDK提供的解析XMLAPI,但是在實際開發中很少用到,因爲要重新編寫大量的代碼。


XMLJava類(POJO類)映射JAXB

Java對象轉化成XMLmarshal

XML轉化爲Java對象,unmarshal

此方法也是JDK提供的:javax.xml.bind.*

註解:

可參考http://liubuzhudeyun.iteye.com/blog/1518523

http://blog.sina.com.cn/s/blog_4a5ca0240100hmo9.html




Dom4j

http://www.blogjava.net/i369/articles/154264.html

http://www.ibm.com/developerworks/cn/xml/x-dom4j.html

dom4j的一個工具類:

package com.xml.dom4j;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
 *dom4j的學習可參考官網
 *下載官網:
 *http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/
 *學習詳細用法可參考具體官方API接口文檔說明
 */
public class XmlUtil {
      
    /**
     * tagName=list
     * 理解element是什麼東西
     * Element interface defines an XML element.
     * An element can have declared namespaces, attributes, child nodes and textual content
     * http://hi.daidu.com/331703405/item/d3a7388916fcc8d75e0c1d1
     * @param document
     * @param nameSpace
     * @param tagName
     * @return
     */
    public static List<Element> getElementsByNameSpace(Document document, String nameSpace, String tagName){
        Map map = new HashMap();
        map.put("ns", nameSpace);
        XPath xPath = document.createXPath("//ns:" + tagName);
        xPath.setNamespaceURIs(map);
        List<Element> list = xPath.selectNodes(document);
        return list;
    }
      
    /**
     * 一般項目處理的時候也可用字符串StringBuffer拼接報文
     * 當大量的xml需要的時侯可用模板Freemarker模塊
     * @param document
     * @throws IOException
     * 來自官網API說明文檔
     */
    public void write(Document document) throws IOException {
        // lets write to a file
        XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
        writer.write(document);
        writer.close();
        // Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        writer = new XMLWriter( System.out, format);
        writer.write(document);
        // Compact format to System.out
        format = OutputFormat.createCompactFormat();
        writer = new XMLWriter(System.out, format);
        writer.write(document);
    }
    /**
     * tagPaht = root.response.list
     * @param document
     * @param tagPath
     * @return
     */
    public static List<Element> getElementsByTagPath(Document document, String tagPath){
         List<Element> list = null;
         Element root = document.getRootElement();
         String[] tags = tagPath.split("\\.");
         if(tags[0].equals(root.getName())){
             Element element = root;
             for (int i = 1; i < tags.length; i++) {
                if(i < tags.length - 1){
                    element = element.element(tags[i]);
                    if(element == null) break;
                }else{
                    list = element.elements(tags[i]);
                }
            }
         }
         return list;
    }
    /**
     * 通過路徑獲取標籤值
     * tagPath = root.response.name
     * @param document
     * @param tagPath
     * @return
     */
    public static String getElementTextByTagPath(Document document, String tagPath){
        String text = "";
         Element root = document.getRootElement();
         String[] tags = tagPath.split("\\.");
         if(tags[0].equals(root.getName())){
             Element element = root;
             for (int i = 1; i < tags.length; i++) {
                if(i < tags.length - 1){
                    element = element.element(tags[i]);
                    if(element == null) break;
                }else{
                    text = element.elementText(tags[i]);
                }
            }
         }
         return text;
    }
      
      
}



JDOM

http://wenku.baidu.com/link?url=Ld4--fSpe26yGxdBE-MsJhjDfIy4OKD8ee06aYrVWZH5Q8GqPeshPKp3DuU99OipK2b2CHi5rS8yUNtGSCk8JwZBJzHxvP6iI-lIk2kMkE3



http://www.cnblogs.com/fancyzero/archive/2012/06/09/jdom.html

http://blog.sina.com.cn/s/blog_67da087b0100i4xf.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章