# Java系列之XML
XML是一種可擴展標記語言,之前學習HTML的時候就已經學習過了,為什么今天要在這里重新提起呢?因為XML是J2EE的十三個規范之一。
## 重新回顧
可擴展標記語言,標準通用標記語言的子集,是一種用于標記電子文件使其具有結構性的標記語言。?
在電子計算機中,標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種的信息比如文章等。它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 它非常適合萬維網傳輸,提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據。是Internet環境中跨平臺的、依賴于內容的技術,也是當今處理分布式結構信息的有效工具。早在1998年,W3C就發布了XML1.0規范,使用它來簡化Internet的文檔信息傳輸。
## 加深理解
### 一、什么是可擴展標記語言?
可擴展標記語言是一種很像超文本標記語言的標記語言。?
它的設計宗旨是傳輸數據,而不是顯示數據。?
它的標簽沒有被預定義。您需要自行定義標簽。?
它被設計為具有自我描述性。?
它是W3C的推薦標準。
### 二、可擴展標記語言和超文本標記語言之間的差異
它不是超文本標記語言的替代。?
它是對超文本標記語言的補充。
#### 它和超文本標記語言為不同的目的而設計:
它被設計用來傳輸和存儲數據,其焦點是數據的內容。?
超文本標記語言被設計用來顯示數據,其焦點是數據的外觀。?
超文本標記語言旨在顯示信息,而它旨在傳輸信息。
#### 對它最好的描述是:
它是獨立于軟件和硬件的信息傳輸工具。
## 兩種解析方式
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>
~~~
### 1.DOM生成和解析XML文檔
為 XML 文檔的已解析版本定義了一組接口。解析器讀入整個文檔,然后構建一個駐留內存的樹結構,然后代碼就可以使用 DOM 接口來操作這個樹結構。優點:整個文檔樹在內存中,便于操作;支持刪除、修改、重新排列等多種功能;缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;使用場合:一旦解析了文檔還需多次訪問這些數據;硬件資源充足(內存、CPU)。
~~~
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 (Exception e) {
System.out.println(e.getMessage());
}
}
~~~
### 2.SAX生成和解析XML文檔
為解決DOM的問題,出現了SAX。SAX ,事件驅動。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,占用資源少;SAX解析器代碼比DOM解析器代碼小,適于Applet,下載。缺點:不是持久的;事件過后,若沒保存數據,那么數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬于哪個元素;使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少;
~~~
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 (Exception e) {
e.printStackTrace();
}
}
~~~