XML簡介
圍繞XML涉及到四方面的技術:
1、數據定義Schema、DTD
2、數據解析DOM、SAX兩種解析模型
3、樣式風格XSTL,使用XSTL可以將XML文件中存放的內容按照指定的樣式顯示爲HTML頁面
4、實現語言JAVA,NET,JavaScript等,幾乎所有的程序語言都提供支持。所有操作XML的功能都有額外的語言提供。另Java中可以使用SAX、JDOM、dom4j等API操作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);
其他方法可參考JDK,javax.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());
其他具體方法可參考JDK:org.xml.sax.*; javax.xml.parsers.
DOM和SAX都是JDK提供的解析XML的API,但是在實際開發中很少用到,因爲要重新編寫大量的代碼。
XML與Java類(POJO類)映射JAXB
Java對象轉化成XML,marshal
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://www.cnblogs.com/fancyzero/archive/2012/06/09/jdom.html
http://blog.sina.com.cn/s/blog_67da087b0100i4xf.html