最近接到一個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文件,是不是這樣,如果是的,你就成功了,恭喜恭喜!
好了,寫到這裏,要睡覺了!