JDOM解析XML文件发表于:2008年3月28日 8时44分54秒阅读(3)评论(0)本文链接:http://user.qzone.qq.com/59757282/blog/1206665094
JDOM解析XML文件
JDOM是利用JAVA解析XML的工具包。
JAVA中很多配置文件都是以XML形式存在的。这样就避免不了需要程序员去解析它,
下面就是我最近项目中对XML解析的一个小小总结,希望能对大家有所帮助!(音乐该起了,掌声也该响起来了哦!)
首先介绍一下项目背景,该项目是给公安部门使用的协同办案系统,可以使用多个身份的公安系统,介于每个省份需求不一样又避免重复的开发,
同时也为了日后维护方便,这个版本的系统在设计初期就有一个基本主线就是可配置性。包括权限的配置,菜单的配置,功能点的配置……这样就涉及
到需要解析很多XML文件。
想必很多JAVA程序员都用使用过XML配置文件(如果没有使用过的以下内容可以不用看了,请直接跳过,谢谢!)比如Hibernate,Spring等流行框架都
是基于XML配置的。这里就不在多说关于XML规则方面的东西了,直接看一个简单的实例:
<?xml version="1.0" encoding="UTF-8"?>
<operations>
<!--省略若干其配置-->
<operation name="BG_CQJCKYYJDBBGS">
<action>jckyyjdbAction</action>
<create>/dcqz/jckyyjdb/jckyyjdb.jsp</create>
<update>/dcqz/jckyyjdb/jckyyjdb.jsp</update>
<redo>/dcqz/jckyyjdb/jckyyjdb.jsp</redo>
<entity>com.gnt.xtba.entity.XtbaZccs</entity> 具体业务的实体类
<fields>saryid</fields> 业务POJO中人员或者组织ID的属性字段
<lb>ry</lb> 人员或者组织类别(只有两种选择,RY或者ZZ。业务只涉及人员的统一用RY,既涉及人员又涉及组织的统一使用ZZ。切忌不能写成RY,ZZ)
</operation>
<!--省略若干其配置-->
<operations>
说明:截取一部分XML,
我们现在要解析operation.xml相对路径为/conf/report/operation.xml。解析的目的:根据指定的name得到具体的entity,取得其中指定的fields的值。
代码如下:
//代码中用到的RyzzwhEntity为定义的需要解析子节点组成的VO,这里就不需要公布代码了吧。
public class Test(){
private Map operationMap =new HashMap();
private String path="/conf/report/operation.xml";
public Collection getAll() {
if(operationMap.isEmpty()){
this.load();
}
return operationMap.values();
}
public RyzzwhEntity getRyzzwhEntity(String name) {
if(operationMap.isEmpty()){
load();
}
RyzzwhEntity ryzz = (RyzzwhEntity)operationMap.get(name);
if(ryzz==null){
throw new ServiceException(name+"没有配置,配置路径"+path);
}
return ryzz;
}
private synchronized void load(){
InputStream in = null;
try{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
in = loader.getResourceAsStream(path);
}catch(Exception e){
throw new ServiceException("配制文件没有找到:"+path);
}
if(in==null)
throw new ServiceException("配制文件没有找到:"+path);
SAXBuilder builder = new SAXBuilder(false); //构造JDOM默认的XML解析器
try{
Document doc = builder.build(in); //得到Document,我们以后要进行的所有操作都是对这个Document操作的.
Element operations = doc.getRootElement(); //得到根节点
List operationList = operations.getChildren("operation"); //得到根节点下面名为operation的子节点的集合
for(Iterator it = operationList.iterator();it.hasNext();){ //遍历
Element operation = (Element)it.next();
String name = operation.getAttributeValue("name"); //得到名为指定参数的 值
if(name!=null){
name = name.trim().toUpperCase(); //具体业务相关的,不需要多加考虑
}else
continue;
RyzzwhEntity ryzz = new RyzzwhEntity();
ryzz.setName(name);
ryzz.setEntity(operation.getChildTextTrim("entity")); //得到具体的值赋给VO。
ryzz.setFields(operation.getChildTextTrim("fields"));
ryzz.setLb(operation.getChildTextTrim("lb"));
operationMap.put(name, ryzz); //用MAP维护VO,KEY值为传入的NAME
}
in.close(); //记得关闭流
}catch(Exception e){
e.printStackTrace();
}
}
public void reload() {
operationMap.clear();
}
}
最后总结如下:
1、使用JDOM要先指定解析器,如:SAXBuilder builder=new SAXBuilder(false); 这表示使用的是默认的解析器
2、得到Document对象。
3、根据Document得到根节点。如:Element element = org.jdom.Document.getRootElement();
4、得到根节点下面所有子节点的集合 List list = element.getChildren(String name); 得到指定那么的集合
5、遍历(大家都知道这里就不多讲了)
6、取子节点的属性或者子节点包含的元素
属性的取法:org.jdom.Element.getAttributeValue(指定的名字);
包含的子元素的取法:org.jdom.Element.getChildTextTrim(指定的名字);
7、修改值(这里就不介绍,需要指出,修改完了要通过XMLOUTPUTTER.OUTPUT(DOCUMENT,new FileOutputStream(xmlpath))保存到XML,不然只是修改了DOCUMENT对象)
8、关闭流
以上拙见,请大家批评指正!
JAVA中很多配置文件都是以XML形式存在的。这样就避免不了需要程序员去解析它,
下面就是我最近项目中对XML解析的一个小小总结,希望能对大家有所帮助!(音乐该起了,掌声也该响起来了哦!)
首先介绍一下项目背景,该项目是给公安部门使用的协同办案系统,可以使用多个身份的公安系统,介于每个省份需求不一样又避免重复的开发,
同时也为了日后维护方便,这个版本的系统在设计初期就有一个基本主线就是可配置性。包括权限的配置,菜单的配置,功能点的配置……这样就涉及
到需要解析很多XML文件。
想必很多JAVA程序员都用使用过XML配置文件(如果没有使用过的以下内容可以不用看了,请直接跳过,谢谢!)比如Hibernate,Spring等流行框架都
是基于XML配置的。这里就不在多说关于XML规则方面的东西了,直接看一个简单的实例:
<?xml version="1.0" encoding="UTF-8"?>
<operations>
<!--省略若干其配置-->
<operation name="BG_CQJCKYYJDBBGS">
<action>jckyyjdbAction</action>
<create>/dcqz/jckyyjdb/jckyyjdb.jsp</create>
<update>/dcqz/jckyyjdb/jckyyjdb.jsp</update>
<redo>/dcqz/jckyyjdb/jckyyjdb.jsp</redo>
<entity>com.gnt.xtba.entity.XtbaZccs</entity> 具体业务的实体类
<fields>saryid</fields> 业务POJO中人员或者组织ID的属性字段
<lb>ry</lb> 人员或者组织类别(只有两种选择,RY或者ZZ。业务只涉及人员的统一用RY,既涉及人员又涉及组织的统一使用ZZ。切忌不能写成RY,ZZ)
</operation>
<!--省略若干其配置-->
<operations>
说明:截取一部分XML,
我们现在要解析operation.xml相对路径为/conf/report/operation.xml。解析的目的:根据指定的name得到具体的entity,取得其中指定的fields的值。
代码如下:
//代码中用到的RyzzwhEntity为定义的需要解析子节点组成的VO,这里就不需要公布代码了吧。
public class Test(){
private Map operationMap =new HashMap();
private String path="/conf/report/operation.xml";
public Collection getAll() {
if(operationMap.isEmpty()){
this.load();
}
return operationMap.values();
}
public RyzzwhEntity getRyzzwhEntity(String name) {
if(operationMap.isEmpty()){
load();
}
RyzzwhEntity ryzz = (RyzzwhEntity)operationMap.get(name);
if(ryzz==null){
throw new ServiceException(name+"没有配置,配置路径"+path);
}
return ryzz;
}
private synchronized void load(){
InputStream in = null;
try{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
in = loader.getResourceAsStream(path);
}catch(Exception e){
throw new ServiceException("配制文件没有找到:"+path);
}
if(in==null)
throw new ServiceException("配制文件没有找到:"+path);
SAXBuilder builder = new SAXBuilder(false); //构造JDOM默认的XML解析器
try{
Document doc = builder.build(in); //得到Document,我们以后要进行的所有操作都是对这个Document操作的.
Element operations = doc.getRootElement(); //得到根节点
List operationList = operations.getChildren("operation"); //得到根节点下面名为operation的子节点的集合
for(Iterator it = operationList.iterator();it.hasNext();){ //遍历
Element operation = (Element)it.next();
String name = operation.getAttributeValue("name"); //得到名为指定参数的 值
if(name!=null){
name = name.trim().toUpperCase(); //具体业务相关的,不需要多加考虑
}else
continue;
RyzzwhEntity ryzz = new RyzzwhEntity();
ryzz.setName(name);
ryzz.setEntity(operation.getChildTextTrim("entity")); //得到具体的值赋给VO。
ryzz.setFields(operation.getChildTextTrim("fields"));
ryzz.setLb(operation.getChildTextTrim("lb"));
operationMap.put(name, ryzz); //用MAP维护VO,KEY值为传入的NAME
}
in.close(); //记得关闭流
}catch(Exception e){
e.printStackTrace();
}
}
public void reload() {
operationMap.clear();
}
}
最后总结如下:
1、使用JDOM要先指定解析器,如:SAXBuilder builder=new SAXBuilder(false); 这表示使用的是默认的解析器
2、得到Document对象。
3、根据Document得到根节点。如:Element element = org.jdom.Document.getRootElement();
4、得到根节点下面所有子节点的集合 List list = element.getChildren(String name); 得到指定那么的集合
5、遍历(大家都知道这里就不多讲了)
6、取子节点的属性或者子节点包含的元素
属性的取法:org.jdom.Element.getAttributeValue(指定的名字);
包含的子元素的取法:org.jdom.Element.getChildTextTrim(指定的名字);
7、修改值(这里就不介绍,需要指出,修改完了要通过XMLOUTPUTTER.OUTPUT(DOCUMENT,new FileOutputStream(xmlpath))保存到XML,不然只是修改了DOCUMENT对象)
8、关闭流
以上拙见,请大家批评指正!