百戰程序員-xml
1、用自己的語言說出,為什麽需要XML?
XML 是一種元標註語言,該語言提供一種描述結構數據的格式。這有助於更精確地聲明內容,方便跨越多種平臺的更有意義的搜索結果。此外,XML 將起用新一代的基於 Web 的數據查看和處理應用程序。
XML 提供可以廣泛執行並易於配置的數據的結構表示。XML 是 萬維網協會(W3C) 定義的用於優化 Web 上的傳輸的 SGML 的子集,XML 確保結構數據是一致的並獨立於應用程序或供應商。由此產生的互用性正在啟動新一代的商業和電子商務 Web 應用程序。
XML 提供可以編碼各種情況(從簡單至復雜)的內容、語義和架構的數據標準,可被用於標註以下對象:
- 普通文檔。
- 諸如約會記錄或采購定單之類的結構記錄。
- 具有數據和方法的對象,如 Java 對象或 ActiveX 控件的持續型表單。
- 數據記錄,如查詢的結果集。
- 有關 Web 站點的元內容,如“頻道定義格式 (CDF)”。
- 圖形表示,如應用程序的用戶界面。
- 標準架構實體和類型。
- Web 上的信息與用戶之間的所有鏈接。
2、用自己的話描述XML有什麽作用?
XML 應用於 web 開發的許多方面,常用於簡化數據的存儲和共享。
- XML 把數據從 HTML 分離
如果你需要在 HTML 文檔中顯示動態數據,那麽每當數據改變時將花費大量的時間來編輯 HTML。
通過 XML,數據能夠存儲在獨立的 XML 文件中。這樣你就可以專註於使用 HTML 進行布局和顯示,並確保修改底層數據不再需要對 HTML 進行任何的改變。
通過使用幾行 JavaScript,你就可以讀取一個外部 XML 文件,然後更新 HTML 中的數據內容。
- XML 簡化數據共享
在真實的世界中,計算機系統和數據使用不兼容的格式來存儲數據。
XML 數據以純文本格式進行存儲,因此提供了一種獨立於軟件和硬件的數據存儲方法。
這讓創建不同應用程序可以共享的數據變得更加容易。
- XML 簡化數據傳輸
通過 XML,可以在不兼容的系統之間輕松地交換數據。
對開發人員來說,其中一項最費時的挑戰一直是在因特網上的不兼容系統之間交換數據。
由於可以通過各種不兼容的應用程序來讀取數據,以 XML 交換數據降低了這種復雜性。
- XML 簡化平臺的變更
升級到新的系統(硬件或軟件平臺),總是非常費時的。必須轉換大量的數據,不兼容的數據經常會丟失。
XML 數據以文本格式存儲。這使得 XML 在不損失數據的情況下,更容易擴展或升級到新的操作系統、新應用程序或新的瀏覽器。
- XML 使您的數據更有用
XML 用於創建新的 Internet 語言
很多新的 Internet 語言是通過 XML 創建的:
- 其中的例子包括:
XHTML - 最新的 HTML 版本
WSDL - 用於描述可用的 web service
WAP 和 WML - 用於手持設備的標記語言
RSS - 用於 RSS feed 的語言
RDF 和 OWL - 用於描述資源和本體
SMIL - 用於描述針針對 web 的多媒體
3、XML文件的基本語法要求有哪些?
1、註釋
XML的註釋與HTML的註釋相同,以“<!--”開始,以“-->”結束。
2、區分大小寫
在HTML中是不區分大小寫的,而XML區分大小寫,包括標記,屬性,指令等。
3、標記
XML標記與HTML標記相同,“<”表示一個標記的開始,“>” 表示一個標記的結束。XML中只要有起始標記,就必須有結束標記,而且在使用嵌套結構時,標記之間不能交叉。
在XML中不含任何內容的標記叫做空標記,格式為:<標記名稱/>
4、屬性
XML屬性的使用與HTML屬性基本相同,但需要註意的是屬性值要加雙引號。
5、實體引用
實體引用是指分析文檔時會被字符數據取代的元素,實體引用用於XML文檔中的特殊字符,否則這些字符會被解釋為元素的組成部分。例如,如果要顯示“<”,需要使用實體引用“<”否則會被解釋為一個標記的起始。
XML中有5個預定義的實體引用,如表 4.1所示。
表 4.1 XML預定義的實體引用
< |
< |
> |
> |
" |
" |
' |
‘ |
& |
& |
6、CDATA
在XML中由一個特殊的標記CDATA,在CDATA中所有文本都不會被XML處理器解釋,直接顯示在瀏覽器中,使用方法如下:
<![CDATA[
這裏的內容可以直接顯示。
]]>
7、處理指令
處理指令使用來給處理XML文件的應用程序提供信息的,處理指令的格式如下:
<?處理指令名稱 處理指令信息?>
例如,XML聲明就是一條處理指令:
<?xml version="1.0" encoding="gb2312"?>
其中,“xml”是處理指令名稱,version="1.0" encoding="gb2312"是處理指令信息。
4、【上機】如下信息,能不能用JSON來表示?能不能用XML表示?請寫出代碼。
“我叫高小七,今年18了,我喜歡如花姑娘,也喜歡我的寵物旺財”
可以
5、【上機】CDATA有什麽作用? 寫出測試代碼
所有 XML 文檔中的文本均會被解析器解析,比如’& nbsp;’將不像其他地方那樣被轉換成空格。只有 CDATA 區段(CDATA section)中的文本會被解析器忽略。
術語 CDATA 指的是不應由 XML 解析器進行解析的文本數據(Unparsed Character Data)。
在 XML 元素中,”<” 和 “&” 是非法的。
“<” 會產生錯誤,因為解析器會把該字符解釋為新元素的開始。
“&” 也會產生錯誤,因為解析器會把該字符解釋為字符實體的開始。
某些文本,比如
JavaScript 代碼,包含大量 “<”
或 “&” 字符。為了避免錯誤,可以將腳本代碼定義為 CDATA。
CDATA 部分中的所有內容都會被解析器忽略。
CDATA 部分中的所有內容都會被解析器忽略。
CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結束:
6、dtd技術有什麽作用? schema技術什麽作用?二者之間有什麽關系?
- DTD在頁面中的作用
①DTD(Document Type Definition文檔類型定義)是一組機器可讀的規則,它們定義XML或HTML的特定版本中允許有什麽,不允許有什麽。在解析網頁時,瀏覽器將使用這些規則檢查頁面的有效性並且采取相應的措施。(由DTD中定義的文檔類型影響)
②DTD是對HTML文檔聲明,還會影響瀏覽器的渲染模式(工作模式)。(由頁面中書寫DTD的方式影響)
- DTD規定XML或HTML中的標簽和語法
1)HTML 4.01規定了三種文檔類型:Strict、Transitional 以及 Frameset
2)XHTML 1.0 規定了三種 XML 文檔類型:Strict、Transitional 以及 Frameset。
3)HTML5只規定了一種文檔類型:
- DTD會影響瀏覽器的渲染模式:
Schema的作用:
- · 定義與作用
- Schema描述XML文檔的結構
- 是基於XML的DTD替代者
- Schema也稱為:XML Schema Definition(XSD)
- Schema要比DTD更強大
- · Schema與DTD的異同
- Schema是DTD的繼任者
- Schema將來會取代DTD
- Schema優勢:
- 針對未來的需求進行擴展
- 更加完善,功能更加強大
- 基於XML編寫
- 支持數據類型
- 使用XML的語法
- 由XML編寫Schema有很多好處
- 不必學習新的語言
- 可使用XML編輯器來編輯Schema文件
- 可使用XML編輯器來解析Schema文件
- Schema可保護數據通信:
- Schema是可擴展的,因為是XML編寫的,
- 通過可擴展的Schema定義:
- 在其他Schema中重負使用您的Schema
- 創建由標準類型衍生而來的您自己的數據類型
- 在相同文檔中引用多重的Schema
- Schema例子:
- 對Schema的使用:
- Schema文件的解釋:
7、xsl技術是做什麽的?
XSL 之於 XML 就像 CSS 之於 HTML。它是指可擴展樣式表語言 (EXtensible Stylesheet Language)。這是一種用於以可讀格式呈現 XML 數據的語言。
XSL 實際上包含兩個部分:
* XSLT – 用於轉換 XML 文檔的語言
* XPath – 用於在 XML 文檔中導航的語言
XSLT 是指 XSL 轉換 (XSL Transformation),它是 XSL 最重要的部分。
8、XML解析中,請說出DOM和SAX的區別。
解析xml有四種方法:DOM,SAX,DOM4j,JDOM.
我們主要學了兩種:DOM和SAX.
DOM適於解析比較簡單的XML而SAX則適於解析較復雜的XML文件。各有各的好。
DOM和SAX的不同:
1. DOM是基於內存的,不管文件有多大,都會將所有的內容預先裝載到內存中。從而消耗很大的內存空間。而SAX是基於事件的。當某個事件被觸發時,才獲取相應的XML的部分數據,從而不管XML文件有多大,都只占用了少量的內存空間。
2. DOM可以讀取XML也可以向XML文件中插入數據,而SAX卻只能對XML進行讀取,而不能在文件中插入數據。這也是SAX的一個缺點。
3.SAX的另一個缺點:DOM我們可以指定要訪問的元素進行隨機訪問,而SAX則不行。SAX是從文檔開始執行遍歷的。並且只能遍歷一次。也就是說我們不能隨機的訪問XML文件,只能從頭到尾的將XML文件遍歷一次(當然也可以中間截斷遍歷)。
9、【上機】使用JDOM解析XML文檔。參考老師課堂代碼
//註:使用前需要下載JDOM的jar包(我用的是jdom-2.0.5.jar)並且把它加載在類路徑裏面(Properties->Java Build Path -> Add External JARs...) Java程序如下,詳細說明見代碼註釋: package com.example.xml.jdom; import java.io.FileOutputStream; import org.jdom2.Attribute; import org.jdom2.Comment; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; /** * 使用JDOM構造一個XML文檔,並輸出 * */ public class JDOMTest1 { public static void main(String[] args) throws Exception { // 文檔 Document document = new Document(); // 生成一個元素 Element root = new Element("root"); // 將生成的元素加入文檔:根元素 document.addContent(root); // 給結點加上註釋 Comment comment = new Comment("This is my comments"); root.addContent(comment); // 加上子元素1 Element e = new Element("hello"); // 加屬性 e.setAttribute("sohu", "www.sohu.com"); root.addContent(e); // 加子元素2 Element e2 = new Element("world"); Attribute attribute = new Attribute("testAttr", "attr Value"); e2.setAttribute(attribute);// set方法會返回元素本身(方法鏈method chain style) root.addContent(e2); e2.addContent(new Element("subElement").setAttribute("a", "aValue") .setAttribute("x", "xValue").setAttribute("y", "yValue") .setText("textContent")); // 格式化 Format format = Format.getPrettyFormat(); // Format.getRawFormat()方法,通常用於XML數據的網絡傳輸,因為這種格式會去掉所有不必要的空白,因此能夠減少數據量 // 可以自己設定一些format的屬性 format.setIndent(" ");// 把縮進設為四個空格(默認為兩個空格) // 輸出 XMLOutputter out = new XMLOutputter(format); out.output(document, new FileOutputStream("jdom.xml"));// 可在當前項目路徑下找到 } } 刷新後可以看到項目路徑下生成了文檔jdom.xml: <?xml version="1.0" encoding="UTF-8"?> <root> <!--This is my comments--> <hello sohu="www.sohu.com" /> <world testAttr="attr Value"> <subElement a="aValue" x="xValue" y="yValue">textContent</subElement> </world> </root>View Code
實例2,使用JDOM解析並操縱XML文檔: 就讀入上面創建的文檔,Java代碼: package com.example.xml.jdom; import java.io.File; import java.io.FileWriter; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; /** * 讀取一個XML文檔 * */ public class JDOMTest2 { public static void main(String[] args) throws Exception { // 構造器 SAXBuilder saxBuilder = new SAXBuilder(); // 獲取文檔 Document document = saxBuilder.build(new File("jdom.xml")); // 得到根元素 Element element = document.getRootElement(); System.out.println("Root: " + element.getName()); // 獲取子元素 Element hello = element.getChild("hello"); System.out.println("child: " + hello.getName()); // 獲取屬性 List<Attribute> list = hello.getAttributes(); for (int i = 0; i < list.size(); ++i) { Attribute attr = (Attribute) list.get(i); String attrName = attr.getName(); String attrValue = attr.getValue(); System.out.println("hello的屬性: " + attrName + " = " + attrValue); } // 移除一個元素 element.removeChild("world"); // 設定格式 XMLOutputter out = new XMLOutputter(Format.getPrettyFormat().setIndent( " ")); out.output(document, new FileWriter("jdom2.xml")); // FileWriter和FileOutputStream都能用 } } 另存後的jdom2.xml: <?xml version="1.0" encoding="UTF-8"?> <root> <!--This is my comments--> <hello sohu="www.sohu.com" /> </root>
JDOM介紹
JDOM是一種使用XML的獨特Java工具包,用於快速開發XML應用程序。
它的設計包含Java語言的語法乃至語義。
JDOM是一個開源項目,它基於樹形結構,利用純Java的技術對XML文檔實現解析、生成、序列化及多種操作。
JAXP
JAXP(用於XML語法分析的Java API)包含了三個包:
org.w3c.dom
W3C推薦的用於XML標準文檔對象模型的Java工具。
org.xml.sax
用於對XML進行語法分析的事件驅動的簡單API。
javax.xml.parsers
工廠化工具,允許應用程序開發人員獲得並配置特殊的語法分析器工具,JDOM能夠替換org.w3c.dom軟件包來有計劃地操作XML文檔。
JDOM和DOM及SAX的關系
JDOM主要用來彌補DOM和SAX在實際應用當中的不足。
主要是SAX沒有文檔修改、隨機訪問及輸出的功能;
而DOM,Java程序員在使用時總覺得不太方便(比如DOM定義了自己的Text類而不是使用Java的String)。
DOM的局限性:
DOM的缺點主要是由於DOM是一個接口定義語言(IDL),它的任務是在不同語言實現中的一個最低的通用標準,並不是為Java特別設計的。
DOM API沿襲了XML規範,在XML中,每件東西都是一個結點,因此在DOM中找到的幾乎每件東西都基於Node接口。
就多態性來講,它是優秀的,但鑒於如上解釋,它在Java語言中的應用是困難而且不便的,其中從Node向葉類型作顯式向下類型轉換會導致代碼的冗長和難以理解。
JDOM是作為一種輕量級的API被制定的,最主要的是它是以Java為中心的。它在遵循DOM主要規則的基礎上除去了上述缺點。
JDOM是Java平臺專用的,只要有可能,API都使用Java語言的內建String支持。
在JDOM中,XML元素就是Element的實例,XML屬性就是Attribute的實例,XML文檔本身就是Document的實例。
類驅動:因為JDOM對象就是像Document、Element和Attribute這些類的直接實例,因此創建一個新的JDOM對象就如在Java語言中使用new操作符一樣容易。
它還意味著不需要進行工廠化接口配置——JDOM的使用是直截了當的。
百戰程序員-xml