1 简介

java解析xml,就个人所知有3种方法DOM、SAX和Digester。前两种需要编写大量代码,且不利于代码移植和复用;

Digester解析xml又有两种方式,代码和xmlrule。xmlrule方式读取规定格式的xml解析规则文件,将标签和属性值赋值到指定的Java POJO对象。

2 待解析的xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<?xml-stylesheet type="text/xsl" href="uhhe.xsl"?>
<GEOBOUND>
<GEOPT X="1" Y="1" Z="1">
  <X SIZE="1" TYPE="5">10.00000000</X>
  <Y SIZE="1" TYPE="5">10.00000000</Y>
  <Z SIZE="1" TYPE="5">10.00000000</Z>
</GEOPT>
<GEOPT X="1" Y="1" Z="1">
  <X SIZE="1" TYPE="5">20.00000000</X>
  <Y SIZE="1" TYPE="5">20.00000000</Y>
  <Z SIZE="1" TYPE="5">20.00000000</Z>
</GEOPT>
<GEOPT X="1" Y="1" Z="1">
  <X SIZE="1" TYPE="5">30.00000000</X>
  <Y SIZE="1" TYPE="5">30.00000000</Y>
  <Z SIZE="1" TYPE="5">30.00000000</Z>
</GEOPT>
<GEOPT X="1" Y="1" Z="1">
  <X SIZE="1" TYPE="5">40.00000000</X>
  <Y SIZE="1" TYPE="5">40.00000000</Y>
  <Z SIZE="1" TYPE="5">40.00000000</Z>
</GEOPT>
</GEOBOUND>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3 解析规则文件

<?xml version='1.0'?>
<!DOCTYPE digester-rules PUBLIC
  "-//Apache Commons //DTD digester-rules XML V1.0//EN"
  "http://commons.apache.org/digester/dtds/digester-rules-3.0.dtd">
    <digester-rules>
        <pattern value="GEOBOUND">
            <object-create-rule classname="xml.digester.Bound" /> <!-- 创建对象 -->
            <set-properties-rule /> <!-- 设置属性 -->
            <pattern value="GEOPT">
                <object-create-rule classname="xml.digester.GeoPt" /> <!-- 创建对象 -->
                <bean-property-setter-rule pattern="X" propertyname="dX"/>
                <bean-property-setter-rule pattern="Y" propertyname="dY"/>
                <bean-property-setter-rule pattern="Z" propertyname="dZ"/>
                <set-next-rule methodname="addPt" paramtype="xml.digester.GeoPt"/>
            </pattern>
        </pattern>
    </digester-rules>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

4 存贮解析结果的Java POJO

package xml.digester;
import java.util.Vector;
public class Bound{
    private Vector<GeoPt> pts = new Vector<GeoPt>();
    public void addPt(GeoPt pt){
        pts.add(pt);
    }
    public Vector<GeoPt> getPt(){
        return pts;
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

package xml.digester;

public class GeoPt{

    public double dX;
    public double dY;
    public double dZ;
    public double getdX() {
        return dX;
    }
    public void setdX(double dX) {
        this.dX = dX;
    }
    public double getdY() {
        return dY;
    }
    public void setdY(double dY) {
        this.dY = dY;
    }
    public double getdZ() {
        return dZ;
    }
    public void setdZ(double dZ) {
        this.dZ = dZ;
    }    

}
注意
  • 类成员变量名不可为X、Y、Z,否则digester报错,原因不明。
  • 可以先定义成员变量,然后用MyEclipse工具“生成setter和getter函数”

 

5 xmlrule文件加载类

package xml.digester;

import java.io.File;

import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;

public class myRulesLoader extends FromXmlRulesModule
{
    private String xmlrule;

    public myRulesLoader(String xmlfile){
        xmlrule = xmlfile;
    }
    @Override
    protected void loadRules()
    {
        loadXMLRules( new File( xmlrule ) );
    }

}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

6 运行示例

public static void main(String[] args){
    try {
    // 加载xmlrule文件
    DigesterLoader loader = newLoader(new myRulesLoader("d:\\drule3.xml"));
    // 创建Digester实例
    Digester digester = loader.newDigester();
    // 解析xml文件
    FileInfo info = (FileInfo) digester.parse(new File("d:\\9.xml"));
    // 分析解析结果
    info.show();
    }
    catch (Exception e){
        e.printStackTrace();
    }

}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

7 结果示意

...
Name: Band_1KM_Emissive
    Fname: G:\YX\HDF_NC_H5\MOD021KM.A2009345.0400.005.2010257180913.hdf
    Description:    1KM Emissive Band Numbers for Subsetting
    NS:   16
    NL:   1
    NB:   1
    FileType:    HDF4
    DataType:    FLOAT
    Satellite:  null
    Sensor:  null
     picPath:
     xyz:     0.00.00.0
     xyz:     0.00.00.0
     xyz:     0.00.00.0
     xyz:     0.00.00.0
...

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

apache.commoms.digester3 解析xml文件的更多相关文章

  1. 深入浅出如何解析xml文件---下篇

    在上篇博文中,小编主要介绍xml的两种解析方式,分别是dom4j和dom,今天这篇博文,小编主要来简单介绍一下xml的其她两种解析方式sax和jdom.  sax解析xml文件 sax,全称是Simp ...

  2. Java--Dom解析XML文件

          之前写过几篇关于Java中解析XML文件的方法,不过,感觉不够简单,今天重写了一遍代码,用到的是方法是Dom,其中加入了日志记录功能--Log4j.       好了,不多说了,先把XMl ...

  3. Android程序解析XML文件的方法及使用PULL解析XML案例

    一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...

  4. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  5. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  6. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  7. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  8. XML:使用DOM技术解析xML文件中的城市,实现select级联选择

    中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...

  9. dom4j如何解析XML文件

    最近在 一些对xml文件的操作,下面简单写一个dom4j解析xml文件并将其封装到一个javabean中的例子,只是具有针对性的,不是通用的,仅供参考哦~~ 首先说:dom4j是一个java的XML ...

随机推荐

  1. NOIP2010-普及组复赛-第一题-数字统计

    题目描述 Description 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 ...

  2. java代码块 静态、非静态

    Java虚拟机的内存分区:Java栈.堆.方法区.本地方法栈.PC寄存器.还有一个常量池的概念,虚拟机会为每种类型分配一个常量池,而不是实例. 例如有一个类有很多子类,那么在父类定义的final变量, ...

  3. javascript焦点图之缓冲滚动无缝切换

    在用于实现无缝切换四张图,所以设置了6个图片就是 4,0,1,2,3,4,0 <!DOCTYPE html> <html> <head> <meta char ...

  4. Matlab中矩阵的平方和矩阵中每个元素的平方介绍

    该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍.   设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...

  5. ural 1013. K-based Numbers. Version 3(动态规划)

    1013. K-based Numbers. Version 3 Let’s consider K-based numbers, containing exactly N digits. We def ...

  6. 游戏客户端嵌入页面出白边bug

    需要使用 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > 这样的头部给页面才能去除与客 ...

  7. SQL Server服务开闭

    SQL Server(MSSQLSERVER)是必须要开启的,这个是数据库引擎服务,就像汽车的发动机一样. SQL Server代理(MSSQLSERVER)是代理服务,比如你有一些自动运行的,定时作 ...

  8. git: reset

    git reset --hard:把commit撤销,意思是不仅此次commit提交的文件从本地版本库的状态重置,而且把此次commit的文件也从本地目录中删除 所以如果你执行之后发现,git sta ...

  9. webupload-upload执行上传时,进入的路径与linux服务器上的不一致

    将if判断处改为garage即可. 原因是因为if处判断处理没有执行,因为要需要把从garage开始的到后面的字符串都去掉才行 不然:local=http://www.xxx.com/garage s ...

  10. Android.mk编译APK范例

    以下仅是使用Android.mk编译APK程序的一些范例. 如果你想了解Android.mk的更多内容请参考<Android.mk简介> 一.编译一个简单的APK    LOCAL_PAT ...