Jdom解析嵌套XML<一>_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Jdom解析嵌套XML<一>

Jdom解析嵌套XML<一>

 2012/6/11 0:12:56  javawill  程序员俱乐部  我要评论(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
  • 标签:XML 解析

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

?

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

  • AnalysisXmlForJdom.zip (277.2 KB)
  • 下载次数: 11
发表评论
用户名: 匿名