XmlBeans的使用

最近接到一个Case,需要解析一个xml格式的String,将各个节点的内容放入值对象,经过考虑,决定使用apache的XmlBeans项目来实现,下面就使用情况作个总结:

xmlBeans简单介绍:

xmlBeans有点类似于hibernate的映射文件的实现机制,他根据xml的.xsd文件来生成相应的值对象和解析代码(如果把xml文件理解为一个数据库表,那么.xsd文件相当于表结构,想详细了解,推荐一个很好的论坛:http://bbs.xml.org.cn/index.asp 中国xml论坛),这些事情可以使用xmlBeans带的小工具生成代码和jar包,然后调用生成jar包中的api就可以方便的实现解析。

1. 下载XmlBeans,下载地址http://www.apache.org/dyn/closer.cgi/xmlbeans/,可以下载jar包和源码,里面有很多实例可以参照,特别是有一些.xsd文件和xsdconfig文件对测试非常有用。

2. 解压binaries的zip包到本地,存放路径最好不要含有中文和空格(建议在进行java编程的时候,相关目录最好都不要含有中文和空格)

3. 因为要使用xmlBeans的一些小工具,特别是根据xml的xsd文件来生成class和jar包,推荐配置系统的环境变量,这个配置与配置tomcat,jdk的方式是一样的,当然也可以直接进入bin目录,执行相应的bat文件,这里不详细讲述了

4. 如果使用eclipse,jbuilder 工具,建立新的工程,建立src,classes,lib 等目录,将解压后的目录下的/lib/xbean.jar,/lib/jsr173_1.0.jar , /lib/resolver.jar 加入工程的build path.

5. 执行scomp,scomp工具是生成类的工具,语法格式如下

scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*

几个重要的[dirs]*参数如下

-src [dir] 生成的类文件存放的目录 如 D:/project/other-code/xmlbeansTest/src

-out [dir] 生成的jar文件存放的目录 如 D:/project/other-code/xmlbeansTest/lib/xmlbeanscatalog.jar

-compiler [dir] java编译器目录 如 D:/tools/jbx/jdk1.4/bin/javac

[schemaFile.xsd]*  xsd文件的路径 如 D:/xmlbeans-2.1.0/samples/XsdConfig/schemas/catalog.xsd,如果没有xml,xsd,xsdconfig文件,而为了测试用,可以使用xmlbeans下载包中自带的文件,三个文件都有的如【zip】/samples/XsdConfig/,可以此目录下找到

[config.xsdconfig]* xsdconfig 文件用来指定生成的类文件的文件名和方法名等的生成规范等。如 D:/xmlbeans-2.1.0/samples/XsdConfig/schemas/myconfig.xsdconfig

我写的命令行如下,src,out 目录最好直接指定为工程相应的目录,供参考:

>scomp -src D:/project/other-code/xmlbeansTest/src -out D:/
project/other-code/xmlbeansTest/lib/xmlbeanstest.jar -compiler D:/tools/jbx/jdk1
.4/bin/javac D:/xmlbeans-2.1.0/schemas/easypo.xsd D:/xmlbeans-2.1.0/schemas/easy
po.xsdconfig

6. 将生成的jar文件加入build path (如这里为xmlbeanstest.jar)

7.  编写测试类来测试,举例如下,使用如上的xsd文件(解压包自带的)生成的类,生成的源码是主要是值对象,jar包主要是封装了解析的业务逻辑类。

public class MyTest {

 public static void main(String[] args) {
  File xmlFile = new File(
    "D:/xmlbeans-2.1.0/samples/XsdConfig/xml/catalog.xml");

  //   Bind the instance to the generated XMLBeans types.
  XmlCatalogDocumentBean catalogDoc;
  try {

   //当然你可以以多种方式拿到document,比如文件,输入流,字符串等等
   catalogDoc = getDocumentByString();

   //   Get and print pieces of the XML instance.
   //取得目录对象
   com.catalog.XmlCatalogDocumentBean.Catalog catalog = catalogDoc
     .getCatalog();
   //取得Journal对象,在xml中可以看到Journal为Catalog的字节点,可以有多个,所以这里是数组,这个由自动生成类根据xml文件自动判断
   com.catalog.XmlJournalDocumentBean.Journal[] journals = catalog
     .getJournalArray();
   for (int i = 0; i < journals.length; i++) {
    com.catalog.XmlArticleDocumentBean.Article[] articles = journals[i]
      .getArticleArray();
    for (int j = 0; j < articles.length; j++) {
     String title = articles[j].getTitle();
     System.out.println("------title=" + title);
    }
   }

  } catch (XmlException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * 得到Document通过一个xml文件
  *
  * @return
  * @throws XmlException
  * @throws IOException
  */
 private static XmlCatalogDocumentBean getDocumentByFile()
   throws XmlException, IOException {
  File xmlFile = new File(
    "D:/xmlbeans-2.1.0/samples/XsdConfig/xml/catalog.xml");

  XmlCatalogDocumentBean catalogDoc = XmlCatalogDocumentBean.Factory
    .parse(xmlFile);
  return catalogDoc;
 }

 /**
  * 得到Document通过一个xml格式的字符串
  *
  * @return
  * @throws XmlException
  */
 private static XmlCatalogDocumentBean getDocumentByString()
   throws XmlException {
  XmlCatalogDocumentBean catalogDoc;
  //得到一个xml格式的字符串,这里从一个xml文件读取过来
  String xmlAsString = FileReader
    .read("D:/xmlbeans-2.1.0/samples/XsdConfig/xml/catalog.xml");
  catalogDoc = XmlCatalogDocumentBean.Factory.parse(xmlAsString);
  return catalogDoc;
 }
}

//一个简单的文件读的类

import java.io.BufferedReader;
import java.io.IOException;

public class FileReader {

 public static  String read(String fileUrl) {
  try {
   java.io.FileReader fr = null;
   fr = new java.io.FileReader(fileUrl);
   BufferedReader br = new BufferedReader(fr);
   String Line = null;
   String result = "";
   while((Line = br.readLine())!=null){
    result = result + Line;
   }
   return result;
  } catch (IOException e1) {
   e1.printStackTrace();
   return "";
  }

 }
}

执行后可以看到执行结果为

------title=Java programming for high-performance numerical computing
------title=Dynamically Binding EJBs Using the Java Reflection API

哈哈,对照一下xml文件,是不是这样,如果是的,你就成功了,恭喜恭喜!

好了,写到这里,要睡觉了!

你可能感兴趣的:(OPEN,SOURCE,XML)