解析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:刘诗雅
女
睡觉
刷剧
追星
打豆豆