Jdom解析嵌套XML
本博文主要采用Jdom對XML 進(jìn)行了詳細(xì)的解析(包括了嵌套的XML、XML格式的字符串、XML文件以及XPATH的使用等等),基本能夠滿足了平時(shí)工作之中所遇到的所有解析XML 工作。
搭建Jdom 解析環(huán)境
給項(xiàng)目添加資源jar包:jdom-2.0.1.jar
具體解析方法
Jdom 的解析器(SAXBuilder)在org.jdom2.input.*這個(gè)包里,其中的DOMBuilder 的功能是將DOM 模型的Document解析成Jdom 模型的Document;SAXBuilder 的功能是從文件或者流中解析解析出符合JDOM模型的XML樹。
①解析XML 文件的代碼
- // 創(chuàng)建一個(gè) SAXBuilder
- SAXBuilder saxBuilder = new SAXBuilder();
- try {
- // 給XML 文件構(gòu)造一個(gè)Document
- Document document = saxBuilder.build("resources/Classinfo.xml");
- // 獲取根元素
- Element root = document.getRootElement();
- } catch (JDOMException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
②解析XML 字符串的代碼
- // 創(chuàng)建測試 XML
- String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- +"<class>"
- +"<name>五年級</name>"
- +"<teacher>張老師</teacher>"
- +"<students>"
- +"<student schoolNo=\"5001\"><name>小明</name><sex>男</sex></student>"
- +"<student schoolNo=\"5002\"><name>小紅</name><sex>女</sex></student>"
- +"</students>"
- +"</class>";
- // 創(chuàng)建一個(gè)字符串的字符流
- StringReader reader = new StringReader(xmlString);
- // 創(chuàng)建新的輸入源 SAX 解析將使用的InputSource 對象來讀取 XML
- InputSource source = new InputSource(reader);
- // 創(chuàng)建一個(gè) SAXBuilder
- SAXBuilder saxBuilder = new SAXBuilder();
- try {
- // 通過輸入源構(gòu)造一個(gè)Document
- Document document = saxBuilder.build(source);
- // 獲取根元素
- Element root = document.getRootElement();
- } catch (JDOMException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
PS:其實(shí)解析XML 格式的字符串就是解析XML 流!
Jdom的Element 對象常用的方法:
方 法 | 說 明 |
getChild("childname") | 返回指定名字的子節(jié)點(diǎn),如果同一級有多個(gè)同名子節(jié)點(diǎn),則只返回第一個(gè);如果沒有返回null值。 |
getChildren("childname") | 返回指定名字的子節(jié)點(diǎn)List集合。這樣你就可以遍歷所有的同一級同名子節(jié)點(diǎn)。 |
getAttributeValue("name") | 返回指定屬性名字的值。如果沒有該屬性則返回null,有該屬性但是值為空,則返回空字符串。 |
getChildText("childname") | 返回指定子節(jié)點(diǎn)的內(nèi)容文本值。 |
getText() | 返回該元素的內(nèi)容文本值。 |
完整解析代碼
- /**
- * Create by iflytekwill@qq.com in 2012-5-15
- */
- package com.javawill.analysis;
- import java.io.IOException;
- import java.io.StringReader;
- import java.util.Iterator;
- import java.util.List;
- import org.jdom2.Document;
- import org.jdom2.Element;
- import org.jdom2.JDOMException;
- import org.jdom2.input.SAXBuilder;
- import org.xml.sax.InputSource;
- /**
- * 解析 XML 字符串類
- * @author <a href="mailto:iflytekwill@qq.com">WillKinG</a>
- * @version 1.0
- */
- public class AnalysisXmlString {
- /**
- * 解析方法
- */
- public void analysis(){
- // 創(chuàng)建測試 XML
- String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- +"<class>"
- +"<name>五年級</name>"
- +"<teacher>張老師</teacher>"
- +"<students>"
- +"<student schoolNo=\"5001\"><name>小明</name><sex>男</sex></student>"
- +"<student schoolNo=\"5002\"><name>小紅</name><sex>女</sex></student>"
- +"</students>"
- +"</class>";
- // 創(chuàng)建一個(gè)字符串的字符流
- StringReader reader = new StringReader(xmlString);
- // 創(chuàng)建新的輸入源 SAX 解析將使用的InputSource 對象來讀取 XML
- InputSource source = new InputSource(reader);
- // 創(chuàng)建一個(gè) SAXBuilder
- SAXBuilder saxBuilder = new SAXBuilder();
- try {
- // 通過輸入源構(gòu)造一個(gè)Document
- Document document = saxBuilder.build(source);
- // 獲取根元素
- Element root = document.getRootElement();
- // 獲取Class 信息
- String clzName = root.getChildText("name");
- String clzTeacher = root.getChildText("teacher");
- System.out.println("Class Name:" + clzName + ";Class Teacher:" + clzTeacher);
- // 解析班級中的學(xué)生
- Element stuRoot = root.getChild("students");
- List list = stuRoot.getChildren("student");
- System.out.println("---- 班級共有" + list.size() + "名學(xué)生 ----");
- for (Iterator it = list.iterator(); it.hasNext();) {
- Element student = (Element) it.next();
- // 獲取Student 信息
- String stuNo = student.getAttributeValue("schoolNo");
- String stuName = student.getChildText("name");
- String stuSex = student.getChildText("sex");
- System.out.println("Student No:" + stuNo + ";Student Name:" + stuName + ";Student Sex:" + stuSex);
- }
- } catch (JDOMException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * 執(zhí)行方法
- * @param args
- */
- public static void main(String[] args) {
- AnalysisXmlString analysisXml = new AnalysisXmlString();
- analysisXml.analysis();
- }
- }
運(yùn)行上面的代碼,控制臺(tái)返回值
- Class Name:五年級;Class Teacher:張老師
- ---- 班級共有2名學(xué)生 ----
- Student No:5001;Student Name:小明;Student Sex:男
- Student No:5002;Student Name:小紅;Student Sex:女