本博文主要采用Jdom对XML 进行了详细的解析(包括了嵌套的XML、XML格式的字符串、XML文件以及XPATH的使用等等),基本能够满足了平时工作之中所遇到的所有解析XML 工作。
搭建Jdom 解析环境
给项目添加资源jar包:jdom-2.0.1.jar
具体解析方法
Jdom 的解析器(SAXBuilder)在org.jdom2.input.*这个包里,其中的DOMBuilder 的功能是将DOM 模型的Document解析成Jdom 模型的Document;SAXBuilder 的功能是从文件或者流中解析解析出符合JDOM模型的XML树。
①解析XML 文件的代码
// 创建一个 SAXBuilder
SAXBuilder saxBuilder = new SAXBuilder();
try {
// 给XML 文件构造一个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 字符串的代码
// 创建测试 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>";
// 创建一个字符串的字符流
StringReader reader = new StringReader(xmlString);
// 创建新的输入源 SAX 解析将使用的InputSource 对象来读取 XML
InputSource source = new InputSource(reader);
// 创建一个 SAXBuilder
SAXBuilder saxBuilder = new SAXBuilder();
try {
// 通过输入源构造一个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:其实解析XML 格式的字符串就是解析XML 流!
Jdom的Element 对象常用的方法:
方 法 | 说 明 |
getChild("childname") | 返回指定名字的子节点,如果同一级有多个同名子节点,则只返回第一个;如果没有返回null值。 |
getChildren("childname") | 返回指定名字的子节点List集合。这样你就可以遍历所有的同一级同名子节点。 |
getAttributeValue("name") | 返回指定属性名字的值。如果没有该属性则返回null,有该属性但是值为空,则返回空字符串。 |
getChildText("childname") | 返回指定子节点的内容文本值。 |
getText() | 返回该元素的内容文本值。 |
完整解析代码
/**
* 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(){
// 创建测试 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>";
// 创建一个字符串的字符流
StringReader reader = new StringReader(xmlString);
// 创建新的输入源 SAX 解析将使用的InputSource 对象来读取 XML
InputSource source = new InputSource(reader);
// 创建一个 SAXBuilder
SAXBuilder saxBuilder = new SAXBuilder();
try {
// 通过输入源构造一个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);
// 解析班级中的学生
Element stuRoot = root.getChild("students");
List list = stuRoot.getChildren("student");
System.out.println("---- 班级共有" + list.size() + "名学生 ----");
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();
}
}
/**
* 执行方法
* @param args
*/
public static void main(String[] args) {
AnalysisXmlString analysisXml = new AnalysisXmlString();
analysisXml.analysis();
}
}
运行上面的代码,控制台返回值
Class Name:五年级;Class Teacher:张老师
---- 班级共有2名学生 ----
Student No:5001;Student Name:小明;Student Sex:男
Student No:5002;Student Name:小红;Student Sex:女
小弟技术有限,第一次写技术博文,其中多有不合理的、错误的地方,还请各位大虾见谅指正。