最近接到一个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文件,是不是这样,如果是的,你就成功了,恭喜恭喜!
好了,写到这里,要睡觉了!