XML的DOM解析 Java實現 使用遞歸解析一個XML文檔
本文是一個練習程序,程序解析了一個XML文檔,並將其原樣輸出在命令行上。
因為要把程序設計成適用於任何XML文檔,所以需要使用遞歸,其中還必須加入元素類型的判斷。
詳見程序:
本文使用的XML文檔:
<?xml version="1.0" encoding="UTF-8"?> <學生名冊 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Course30\student.xsd"> <!-- 注釋:學生1 --> <學生 學號="1"> <姓名>張三</姓名> <性別>男</性別> <年齡>20</年齡> </學生> <學生 學號="2"> <姓名>李四</姓名> <性別>女</性別> <年齡>19</年齡> </學生> <學生 學號="3"> <姓名>王五</姓名> <性別>男</性別> <年齡>21</年齡> </學生> </學生名冊>
Java程序:
package com.learnjava.xml.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * 使用遞歸解析一個XML文檔並且將其內容輸出到命令行上 * */ public class DomTest3 { public static void main(String[] args) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("student.xml")); // 獲取根元素節點 Element root = doc.getDocumentElement(); parseElement(root); } private static void parseElement(Element element) { String tagName = element.getNodeName(); System.out.print("<" + tagName); // element元素的所有屬性構成的NamedNodeMap對象,需要對其進行判斷 NamedNodeMap map = element.getAttributes(); // 如果存在屬性,則打印屬性 if (null != map) { for (int i = 0; i < map.getLength(); i++) { // 獲得該元素的每一個屬性 Attr attr = (Attr) map.item(i); // 屬性名和屬性值 String attrName = attr.getName(); String attrValue = attr.getValue(); // 注意屬性值需要加上引號,所以需要\轉義 System.out.print(" " + attrName + "=\"" + attrValue + "\""); } } // 關閉標簽名 System.out.print(">"); // 至此已經打印出了元素名和其屬性 // 下面開始考慮它的子元素 NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { // 獲取每一個child Node node = children.item(i); // 獲取節點類型 short nodeType = node.getNodeType(); if (nodeType == Node.ELEMENT_NODE) { // 如果是元素類型,則遞歸輸出 parseElement((Element) node); } else if (nodeType == Node.TEXT_NODE) { // 如果是文本類型,則輸出節點值,及文本內容 System.out.print(node.getNodeValue()); } else if (nodeType == Node.COMMENT_NODE) { // 如果是注釋,則輸出注釋 System.out.print("<!--"); Comment comment = (Comment) node; // 注釋內容 String data = comment.getData(); System.out.print(data); System.out.print("-->"); } } // 所有內容處理完之后,輸出,關閉根節點 System.out.print("</" + tagName + ">"); } }
參考資料
聖思園張龍老師視頻教程。
Java官方文檔:http://docs.oracle.com/javase/7/docs/api/index.html