解析Xml檔案:就是把Xml檔案裡面的内容取出來。
Xml檔案解析工具:一個能解析Xml檔案的類,即一個能把Xml檔案裡面的内容取出來的類。
先給出一個Xml檔案(student_infor.xml):
足球
籃球
混球
二球
張三之子,體格壯碩,膽小如鼠,外号加菲貓!
睡覺
刷劇
追星
打豆豆
劉家之女,酷愛唱歌! 但五音有其四,鄰居不堪其擾,謂之劉嘶啞!
先簡單解析一下上面的Xml檔案,代碼如下:
packagecom.zss.about_xml_parser.test;importjava.io.IOException;importjava.io.InputStream;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.NodeList;importorg.xml.sax.SAXException;public classTest {public static voidmain(String[] args) {try{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
InputStream is= Test.class.getResourceAsStream("/student_infor.xml");
Document document=db.parse(is); //這幾行代碼就像巫師的咒語,雖然讀不懂,但是效果巨大(産生document)
NodeList studentList= document.getElementsByTagName("student");for(int i = 0; i < studentList.getLength(); i++) {
Element student=(Element) studentList.item(i);
String id= student.getAttribute("id");
String name= student.getAttribute("name");
String sex= student.getAttribute("sex");
String birth= student.getAttribute("birth");
System.out.println("id:" +id);
System.out.println("name:" +name);
System.out.println("sex:" +sex);
System.out.println("birth:[" + birth + "]");
NodeList hobbies= student.getElementsByTagName("hobby");for(int j = 0; j < hobbies.getLength(); j++) {
Element hobby=(Element) hobbies.item(j);
String hobbyName=hobby.getTextContent();
System.out.println("\t" +hobbyName);
}
Element introduce=(Element) student.getElementsByTagName("introduce").item(0);
System.out.println("簡介\n\t" +introduce.getTextContent().trim());
}
}catch(ParserConfigurationException e) {
e.printStackTrace();
}catch(SAXException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}
結果如下:
id:201810001
name:張三小
sex:男
birth:[2000-10-10]
足球
籃球
混球
二球
簡介
張三之子,體格壯碩,膽小如鼠,外号加菲貓!
id:201811001
name:劉詩雅
sex:女
birth:[2010-10-21]
睡覺
刷劇
追星
打豆豆
簡介
劉家之女,酷愛唱歌! 但五音有其四,鄰居不堪其擾,謂之劉嘶啞!
當然,我們不可能在每次解析Xml檔案時,都把上面這段代碼敲一遍。我們完全可以寫一個Xml檔案的解析工具,然後把它打成jar包,以後用的時候導包就行。
注意:上邊所有的輸出不應是我們工具該有的,工具隻負責取出資料,并提供一個操作資料的抽象方法。
工具代碼(XMLParser類):
packagecom.zss.util;importjava.io.IOException;importjava.io.InputStream;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.NodeList;importorg.xml.sax.SAXException;public abstract classXMLParser {private static finalDocumentBuilderFactory dbf;static { //靜态塊 隻在該類第一次被引用時執行,以後再不執行
dbf = DocumentBuilderFactory.newInstance(); //這種方式往往保證dbf是單立的
}publicXMLParser() {
}public abstract void dealElement(Element element, intindex);public voiddealElementInTag(Element element, String tagName) { //此方法用來處理更深入一層的标簽
NodeList elements=element.getElementsByTagName(tagName);for(int index = 0; index < elements.getLength(); index++) {
Element ele=(Element) elements.item(index);//對于element的處理應該由XMLParser的使用者來決定的!
dealElement(ele, index);
}
}public voiddealElementInTag(Document document, String tagName) { //此方法用來處理最外層标簽
NodeList elements=document.getElementsByTagName(tagName);for(int index = 0; index < elements.getLength(); index++) {
Element element=(Element) elements.item(index);//對于element的處理應該由XMLParser的使用者來決定的!
dealElement(element, index);
}
}public staticDocument getDocument(String xmlPath) {
Document document= null;try{
DocumentBuilder db=dbf.newDocumentBuilder();
InputStream is= XMLParser.class.getResourceAsStream(xmlPath); //此方法用來得到document
document=db.parse(is);
}catch(ParserConfigurationException e) {
e.printStackTrace();
}catch(SAXException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}returndocument;
}
}
有了這個工具,該怎麼用這個工具去解析Xml檔案呢,繼續往下看:
packagecom.zss.about_xml_parser.test;importorg.w3c.dom.Element;importcom.zss.util.XMLParser;public classTest {public static voidmain(String[] args) {newXMLParser() { // 匿名内部類嵌套
@Overridepublic void dealElement(Element element, intindex) {
String name= element.getAttribute("name");
String sex= element.getAttribute("sex");
System.out.println("name:" +name);
System.out.println(sex);newXMLParser() {
@Overridepublic void dealElement(Element element, intindex) {
String hobby=element.getTextContent();
System.out.println("\t" +hobby);
}
}.dealElementInTag(element,"hobby"); //這部分代碼請仔細分析!!!
}
}.dealElementInTag(
XMLParser.getDocument("/student_infor.xml"), "student");
}
}
結果如下:
name:張三小
男
足球
籃球
混球
二球
name:劉詩雅
女
睡覺
刷劇
追星
打豆豆