`
wuhongyu
  • 浏览: 404651 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

jdom解析xml

阅读更多

这次把代码整理了一下,打包发上来了,程序中需要用到的jar包也一起打在里面了,有兴趣的朋友可以解压后直接导入的eclipse里运行!

 

    xml是一种广为使用的可扩展标记语言,java中解析xml的方式有很多,最常用的像jdom、dom4j、sax等等。前两天刚好有个程序需要解析xml,就学了下jdom,写了个小例子,这里做个学习笔记。

 

    要使用jdom解析xml文件,需要下载jdom的包,我使用的是jdom-1.1。解压之后,将lib文件夹下的.jar文件以及build文件夹下的jdom.jar拷贝到工程文件夹下,然后就可以使用jdom操作xml文件了。

 

    一、读取xml文件

 

    假设有这样一个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<sys-config>
	<jdbc-info>
		<driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
		<url>jdbc:oracle:thin:@localhost:1521:database</url>
		<user-name>why</user-name>
		<password>why</password>
	</jdbc-info>
	<provinces-info>
		<province id="hlj" name="黑龙江">
			<city id="harb">哈尔滨</city>
			<city id="nj">嫩江</city>
		</province>
		<province id="jl" name="吉林"></province>
	</provinces-info>
</sys-config>

 

    首先,用 org.jdom.input.SAXBuilder 这个类取得要操作的xml文件,会返回一个 org.jdom.Document 对象,这里需要做一下异常处理。然后,取得这个xml文件的根节点,org.jdom.Element 代表xml文件中的一个节点,取得跟节点后,便可以读取xml文件中的信息。利用 org.jdom.xpath.XPath 可以取得xml中的任意制定的节点中的信息。

    例如,要取得上面文件中的 <jdbc-info> 下的 <driver-class-name> 中的内容,先取得这个节点Element driverClassNameElement = (Element)XPath.selectSingleNode(rootEle, "//sys-config/jdbc-info/driver-class-name"),注意,根节点前要使用两个 "/" ,然后,用 driverClassNameElement.getText() 便可以取得这个节点下的信息。

    如果一个节点下有多个名称相同的子节点,可以用XPath.selectNodes()方法取得多个子节点的List,遍历这个List就可以操作各个子节点的内容了。

    下面是我写的读取上面xml文件的例子,比起文字描述更直观一些吧:

package com.why.jdom;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;

public class ReadXML {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SAXBuilder sax = new SAXBuilder();
		try {
			Document doc = sax.build("src/config.xml");
			Element rootEle = doc.getRootElement();
			Element driverClassNameElement = (Element)XPath.selectSingleNode(rootEle, "//sys-config/jdbc-info/driver-class-name");
			String driverClassName = driverClassNameElement.getText();
			System.out.println("driverClassName = " + driverClassName);
			
			List provinceList = XPath.selectNodes(rootEle, "//sys-config/provinces-info/province");
			for(Iterator it = provinceList.iterator();it.hasNext();){
				Element provinceEle = (Element)it.next();
				String proId = provinceEle.getAttributeValue("id");
				String proName = provinceEle.getAttributeValue("name");

				System.out.println("provinceId = " + proId + "   provinceName = " + proName);
				
				List cityEleList = (List)provinceEle.getChildren("city");
				
				for(Iterator cityIt = cityEleList.iterator();cityIt.hasNext();){
					Element cityEle = (Element)cityIt.next();
					String cityId = cityEle.getAttributeValue("id");
					String cityName = cityEle.getText();

					System.out.println("    cityId = " + cityId + "   cityName = " + cityName);
				}
			}
		} catch (JDOMException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}

	}

}

 

 

    二、写xml文件

 

    写xml文件与读取xml文件的操作类似,利用 org.jdom.output.XMLOutputter 就可以将处理好的xml输出到文件了。可以设置文件的编码方式,不过一般使用UTF-8就可以了。代码如下:

 

package com.why.jdom;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

public class WriteXML {

		
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成方法存根
		Element rootEle = new Element("sys-config");
		Element provincesEle = new Element("provinces-info");
		
		Element provinceEle = new Element("province");
		provinceEle.setAttribute("id","hlj");
		provinceEle.setAttribute("name","黑龙江省");
		
		Element cityEle1 = new Element("city");
		cityEle1.setAttribute("id","harb");
		cityEle1.addContent("哈尔滨");
		
		Element cityEle2 = new Element("city");
		cityEle2.setAttribute("id","nj");
		cityEle2.addContent("嫩江");
		
		
		provinceEle.addContent(cityEle1);
		provinceEle.addContent(cityEle2);
		provincesEle.addContent(provinceEle);
		rootEle.addContent(provincesEle);
		
		Document doc = new Document(rootEle);
		
		XMLOutputter out = new XMLOutputter();
		
		
//		out.setFormat(Format.getCompactFormat().setEncoding("GBK"));//设置文件编码,默认为UTF-8
		String xmlStr = out.outputString(doc);
		System.out.println(xmlStr);
		
		try {
			out.output(doc, new FileOutputStream("c:/test.xml"));
		} catch (FileNotFoundException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
		
	}

}

 

分享到:
评论
8 楼 yuanfen2014 2015-03-14  
[color=red][/color] 学习了
7 楼 lanry2008 2014-01-02  
needs two jar : jdom4j*.jar,and jaxen*.jar
6 楼 luwinner 2013-06-17  
挺不错的嘛,楼主
5 楼 shen5277 2010-08-13  
LZ,下次贴代码 顺便把JAR包贴出来
4 楼 shen5277 2010-08-13  
liulehua 写道
我试了一下,我的在这一句开始报错:
Element driverClassNameElement = (Element)XPath.selectSingleNode(rootEle, "//sys-config/jdbc-info/driver-class-name");  

报错如下:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.jdom.xpath.XPath.newInstance(XPath.java:134)
at tool.file.ParseXML2JDOM.readXML(ParseXML2JDOM.java:28)
at tool.file.ParseXML2JDOM.main(ParseXML2JDOM.java:14)
Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 5 more




添加 saxpath.jar
3 楼 wuhongyu 2010-07-16  
2楼的问题应该是缺包,加入jaxen-core.jar和jaxen-jdom.jar试试吧
2 楼 liulehua 2010-07-09  
我试了一下,我的在这一句开始报错:
Element driverClassNameElement = (Element)XPath.selectSingleNode(rootEle, "//sys-config/jdbc-info/driver-class-name");  

报错如下:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.jdom.xpath.XPath.newInstance(XPath.java:134)
at tool.file.ParseXML2JDOM.readXML(ParseXML2JDOM.java:28)
at tool.file.ParseXML2JDOM.main(ParseXML2JDOM.java:14)
Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 5 more

1 楼 xmind 2010-06-30  
不错啊。
对我有帮助

相关推荐

Global site tag (gtag.js) - Google Analytics