Jdom解析嵌套XML<一>

1 篇文章 0 订阅
1 篇文章 0 订阅

本博文主要采用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:女

附件说明:

需要对应附件可到我在ITEYE的博客上下载:点击打开链接


结语:

小弟技术有限,第一次写技术博文,其中多有不合理的、错误的地方,还请各位大虾见谅指正。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值