今天用了下Zeus

  项目组同事昨天用digester转换xml为java对象出了问题,问题是xml对应的java类是wsdl反编译成的,所以很多都是stub的内部类。而digester无法直接生成内部类实例,只能为每个内部类写一个public的工厂方法才能变相支持,不爽。所以身为TL的我,自然要负责给个解决方案了。
     上网看了一下castor,不对好像这个东东也是要自已写个model文件才能转换,好烦,有没有既不用写规则文件,又不用写model文件,又能转换的呢。找了一下,找到一个:Zeus。最新3.5版,还是开源的,公司用不会有版权问题。
     今天试了一下,还是满好用的,只需要给出xml文件的dtd文件,它就会自动生成相应的java类,还有从xml文件转换成java类的方法,执行这个方法一下子就可以把xml文件转换过来,而且效率还是可以的,用户在转换的时候可以设定参数,决定是否检查xml文件的格式,不过由于这样会影响速度,所我我转的时候都没有设。它还可以让你指定错误输出流,只要一行代码就行了。
     具体的使用方法:
     1、从 http://zeus.enhydra.org上下载Zeus,最新的是3.5 Beta版,下载时可以选择是下载src,还是bin,我下载的是bin。
     2、解压下载的包,修改bin/zeus.bat(sh)中的JAVA_HOME路径(要用1.5的jdk)
  3、运行bin目录下的zeus.bat或zeus.sh就可以跟据dtd生成java类和转换方法了,格式和参数如下:
         C:/dev/Zeus>bin/zeus.bat
           Usage: zeus
                  -constraints=   这个是必选参数,指明dtd文件的路径
                  [-outputDir=]   可选,指明生成的java类放在哪个目录下
                  [-collapseSimpleElements=]  如果为false,则生成文本节点后要用 get[ElementName]().getContent()获取值,如果是true,则直接用get[ElementName]()获取
                  [-ignoreIDAttributes=] 是否忽略id属性
                  [-javaPackage=] 生成的java类打在哪个包下
                  [-root=] 如果dtd中只有一个root element,这个属性没有意义,如果有多个,这个属性决定哪个为生成的java类集合的最上层的类
  就这么简单,这样就生成了java类,现在举个例子吧。
  
  比如,有这么个xml文件:
<?xml version="1.0"?>
<!DOCTYPE songs SYSTEM "samples/DTD/song.dtd">
<songs>
   <song>
   <title>The Finishing Touch</title>
   <artist type="Band">Sound Doctrine</artist>
  </song>
  <song>
     <title>Change Your World</title>
     <artist type="Solo">Eric Clapton</artist>
       <artist type="Solo">Babyface</artist>
  </song>
</songs>
可以用下面的语句生成java类,其中, SongsUnmarshaller类提供了接口可以转换xml文件:
C:/dev/Zeus/samples>../bin/zeus.bat -constraints=dtd/song.dtd -outputDir=classes -javaPackage=samples.dtd -collapseSimpleElements=true
 
然后用下面的代码转换xml文件:
  public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("Usage: java samples.TestSongsDTD " +
                "[songs.xml location]");
            return;
        }

        try {
            // Unmarshalling
            Songs songs = SongsUnmarshaller.unmarshal(new File(args[0]), false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
如果你想转换时验证格式,就将false改为true。
如果你想设定自定义的错误输出,就用下面的语句:
SongsUnmarshaller.setErrorHandler(myCustomErrorHandler);
如果你想设定自定义的xml转换器,就用下面的:
System.setProperty("org.xml.sax.driver",
                           "org.apache.crimson.parser.Parser2");
 

你可能感兴趣的:(java,jdk,xml,exception,String,System)