`
javawill
  • 浏览: 13567 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Jdom解析嵌套XML<一>

    博客分类:
  • Java
阅读更多

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

 

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

1
1
分享到:
评论
4 楼 getianyu2008 2012-05-22  
StringReader reader = new StringReader(xmlString);
记住read.close();不然后期找这个问题可就难了。
3 楼 javawill 2012-05-22  
hesy_007 写道
jlcon 写道
还是dom4j比较好

嗯,推荐使用dom4j


恩恩,性能考虑,dom4j应该是首选。
2 楼 hesy_007 2012-05-22  
jlcon 写道
还是dom4j比较好

嗯,推荐使用dom4j
1 楼 jlcon 2012-05-22  
还是dom4j比较好

相关推荐

    xml入门教程/xml入门教程

    2.xml文件是由元素和元素的内容以及属性组成的,一个xml文件中只能有一个根元素,标签和标签的内容加在一起叫作一个元素。xml是大小写 敏感的,只能以字母或下划线开头。 字符转义 &lt; 代表 "&lt;" , &gt; 代表 "&gt;" ,...

    java面试题(JAVA代码与编程).pdf

    4、用jdom 解析xml 文件时如何解决中文问题?如何解析? 5、编程用JAVA解析 XML的方式. 6、EJB的基本架构 7、如何校验数字型? 8、将一个键盘输入的数字转化成中文输出 (例如:输入:1234567 输出:一百二拾三万四千五百六...

    AnotationCodeGenerator-Android:以androidannotation为基础,解析用户布局文件

    支持嵌套xml,支持include标签解析。 生成的代码中包括以下几种类型: + 类描述.包括@EActivity,@EFragment,@EBean + @viewById + @Click事件 + @TextChanged事件 + 基于父类访问网络的回调 嘿嘿,可以提高开发效率...

    千方百计笔试题大全

    202、用jdom解析xml文件时如何解决中文问题?如何解析? 48 203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本...

    java面试宝典

    202、用jdom解析xml文件时如何解决中文问题?如何解析? 48 203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    最新Java面试宝典pdf版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    Java面试宝典2010版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 4、编程用JAVA解析XML的方式. 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 七. 流行的框架与新技术 1、谈谈你对Struts的理解...

    Java面试笔试资料大全

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    JAVA面试宝典2010

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    Java面试宝典-经典

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    java面试题大全(2012版)

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    Java面试宝典2012版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、...

    Java面试宝典2012新版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    java面试宝典2012

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 124 4、编程用JAVA解析XML的方式. 125 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 127 七. 流行的框架与新技术 128 1、谈谈你...

    java源码包---java 源码 大量 实例

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

Global site tag (gtag.js) - Google Analytics