解析Xml文件:就是把Xml文件里面的內容取出來。
Xml文件解析工具:一個能解析Xml文件的類,即一個能把Xml文件里面的內容取出來的類。
先給出一個Xml文件(student_infor.xml):
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="201810001" name="張三小" sex="男" birth="2000-10-10">
<hobby>足球</hobby>
<hobby>籃球</hobby>
<hobby>混球</hobby>
<hobby>二球</hobby>
<introduce> 張三之子,體格壯碩,膽小如鼠,外號加菲貓! </introduce>
</student>
<student id="201811001" name="劉詩雅" sex="女" birth="2010-10-21">
<hobby>睡覺</hobby>
<hobby>刷劇</hobby>
<hobby>追星</hobby>
<hobby>打豆豆</hobby>
<introduce> 劉家之女,酷愛唱歌! 但五音有其四,鄰居不堪其擾,謂之劉嘶啞! </introduce>
</student>
</students>
先簡單解析一下上面的Xml文件,代碼如下:
package com.mec.about_xml_parser.test; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class Test { public static void main(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類):
package com.mec.util; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public abstract class XMLParser { private static final DocumentBuilderFactory dbf; static { // 靜態塊 只在該類第一次被引用時執行,以后再不執行
dbf = DocumentBuilderFactory.newInstance(); // 這種方式往往保證dbf是單立的
} public XMLParser() { } public abstract void dealElement(Element element, int index); public void dealElementInTag(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 void dealElementInTag(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 static Document 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(); } return document; } }
有了這個工具,該怎么用這個工具去解析Xml文件呢,繼續往下看:
package com.mec.about_xml_parser.test; import org.w3c.dom.Element; import com.mec.util.XMLParser; public class Test { public static void main(String[] args) { new XMLParser() { // 匿名內部類嵌套 @Override public void dealElement(Element element, int index) { String name = element.getAttribute("name"); String sex = element.getAttribute("sex"); System.out.println("name:" + name); System.out.println(sex); new XMLParser() { @Override public void dealElement(Element element, int index) { String hobby = element.getTextContent(); System.out.println("\t" + hobby); } }.dealElementInTag(element, "hobby"); //這部分代碼請仔細分析!!! } }.dealElementInTag( XMLParser.getDocument("/student_infor.xml"), "student"); } }
結果如下:
name:張三小
男
足球
籃球
混球
二球
name:劉詩雅
女
睡覺
刷劇
追星
打豆豆