Xml文件解析工具 - java


解析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:劉詩雅

   睡覺
   刷劇
   追星
   打豆豆

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM