Java解析xml檔案的方法
什麼是 XML?
- XML指可擴充套件標記語言(EXtensible Markup Language)
- XML 是一種標記語言,很類似 HTML
- XML 的設計宗旨是傳輸資料,而非顯示資料
- XML 標籤沒有被預定義。您需要自行定義標籤。
- XML 被設計為具有自我描述性。
- XML 是 W3C 的推薦標準
- XML 與 HTML 的主要差異
- XML 不是 HTML 的替代。
XML 和 HTML 為不同的目的而設計:
- XML 被設計為傳輸和儲存資料,其焦點是資料的內容。
- HTML 被設計用來顯示資料,其焦點是資料的外觀。
- HTML 旨在顯示資訊,而 XML 旨在傳輸資訊。
XML是一種通用的資料交換格式,它與平臺、語言、系統無關,給資料整合與互動帶來了極大的方便。對XML本身的語法與技術細節,可以參閱
XML 文件形成一種樹結構
XML文件必須包含根元素。該元素是所有其他元素的父元素。
XML文件中的元素形成了一棵文件樹。這棵樹從根部開始,並擴充套件到樹的最底端。
所有元素均可擁有子元素:
<root>
<child >
<subchild>.....</subchild>
</child>
</root>
父、子以及同胞等術語用於描述元素之間的關係。父元素擁有子元素。相同層級上的子元素成為同胞(兄弟或姐妹)。
所有元素均可擁有文字內容和屬性(類似 HTML 中)。
例項
上圖表示下面的 XML 中的一本書:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title >
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
例子中的根元素是<bookstore>
。文件中的所有 <book>
元素都被包含在 <bookstore>
中。
<book>
元素有 4 個子元素:<title>
、<author>
、<year>
、<price>
。
XML在不同語言裡解析方式都是一樣的,只不過實現的語法不同。基本的解析方式有兩種,一種是DOM,另一種是SAX。DOM是基於XML文件樹結構的解析,SAX是基於事件流的解析。
本文介紹Java解析xml文件的幾種方法。
DOM解析xml文件
為xml文件的已解析版本定義了一組介面。解析器讀入整個文件,然後構建一個駐留記憶體的DOM樹結構,然後可以使用DOM介面來操作這個樹結構。
優點:整個文件樹在記憶體中,便於操作;支援刪除、修改、重新排列等多種功能。
缺點:將整個文件調入記憶體(包括無用的節點),如果文件過大,則佔用過多空間且浪費時間。
適用場合:一旦解析了文件還需多次訪問這些資料,硬體資源充足(記憶體、CPU)。
解析程式碼如下:
public class DomTest {
public void parseXmlPath(String xmlPath) throws Exception{
parseXmlFile(new File(xmlPath));
}
private void parseXmlFile(File file) throws Exception{
//獲取DocumentBuilder工廠
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//從DocumentBuilder工廠中獲取DocumentBuilder物件
DocumentBuilder db = dbf.newDocumentBuilder();
//從DocumentBuilder物件中獲取Document物件
Document doc = db.parse(file);
//從Document物件中獲取根元素物件
//Element 介面表示 HTML 或 XML 文件中的一個元素。
//元素可能有與它們相關的屬性;由於 Element 介面繼承自 Node,
//所以可以使用一般 Node 介面屬性 attributes 來獲得元素所有屬性的集合。
//Element 介面上有通過名稱獲得 Attr 物件或通過名稱獲得屬性值的方法。
//在 XML 中(其中的屬性值可能包含實體引用),應該獲得 Attr 物件來檢查表示屬性值的可能相當複雜的子樹。
Element root = doc.getDocumentElement();
parseElement(root);
}
private void parseElement(Element element){
String tagName = element.getNodeName();
//獲取當前元素的子節點
NodeList childern = element.getChildNodes();
System.out.println("<" + tagName +">");
//實現 NamedNodeMap 介面的物件用於表示可以通過名稱訪問的節點的集合。
NamedNodeMap map = element.getAttributes();
if(map != null){
for(int i = 0;i<map.getLength();i++){
Attr attr = (Attr) map.item(i);
String attrName = attr.getName();
String attrValue = attr.getValue();
System.out.println(" " + attrName +"=\""+attrValue+"\"");
}
}
for(int i=0;i<childern.getLength();i++){
Node node = childern.item(i);
short nodeType = node.getNodeType();
if(nodeType == Node.ELEMENT_NODE){
parseElement((Element)node);
}else if(nodeType == Node.TEXT_NODE){
System.out.println(node.getNodeName()+":"+node.getNodeValue());
}else if(nodeType == Node.COMMENT_NODE){
System.out.print("<!--");
Comment comment = (Comment)node;
String data = comment.getText();
System.out.print(data);
System.out.print("-->");
}
}
System.out.println("</"+tagName + ">");
}
}
SAX解析XML文件
為解決DOM的問題,出現了SAX。SAX,事件驅動。當解析器發現元素開始、元素結束、文字、文件的開始或結束等時,傳送事件,編寫響應這些事件的程式碼,儲存資料。
優點:不用事先調入整個文件,佔用資源少;SAX解析器程式碼比DOM解析器程式碼小。
缺點:不是持久的;事件過後,若沒有儲存資料,那麼資料丟失;無狀態;從事件中只能得到文字,但不知道給文字屬於哪個元素。
適用場合:Applet;只需要XML文件的少量內容,很少回頭訪問;機器記憶體小。
程式碼如下:
DOM4J解析xml文件
DOM4J是一個非常優秀的Java Xml API,具有效能優異、功能強大和易於使用的特點,同時它也是一個開放原始碼的軟體。現在很多Java專案中都使用DOM4J讀寫xml檔案,很多Spring專案也是。