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文件,是不是這樣,如果是的,你就成功了,恭喜恭喜!

好了,寫到這裏,要睡覺了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章