顯示具有 XML 標籤的文章。 顯示所有文章
顯示具有 XML 標籤的文章。 顯示所有文章

2011年10月3日 星期一

XSLT及Eclipse Tutorial

  1. 更新Eclipse,安裝 Helios下的Eclipse XSL Developer Tools
    image
  2. 安裝完後,Eclipse會要求重啟。重新啟動完Eclipse後,建立一個新的Java Project
  3. 在新建的Java Project下新增一個files的目錄
  4. 在files目錄下, 建立source.xml,內容如下
    <?xml version="1.0"?>
    <!-- This is a comment -->
    <people>
    <address type="personal">
    <name>Lars </name>
    <street> Test </street>
    <telephon number="0123" />
    </address>
    <address type="personal">
    <name>Joe </name>
    <street> Test2 </street>
    <telephon number="1234" />
    </address>
    <address type="business">
    <name>Jim</name>
    <street> Test3 </street>
    <telephon number="2345" />
    </address>
    </people>
  5. 在同一目錄下,建立一個transform2.xsl檔案,內容如下
  6. <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">

        <xsl:output method="xml" />

        <!-- Copy everything -->
        <xsl:template match="*">
            <xsl:copy>
                <xsl:copy-of select="@*" />
                <xsl:apply-templates />
            </xsl:copy>
        </xsl:template>

        <!-- Do some adjustments for the address -->
        <xsl:template match="address">
            <xsl:element name="place-where-person-live">
                <xsl:apply-templates />
            </xsl:element>
        </xsl:template>

        <!-- Put the name in a <hubba> tag -->
        <xsl:template match="name">
            <xsl:element name="name">
                <hubba>
                    <xsl:apply-templates />
                </hubba>
            </xsl:element>
        </xsl:template>
    </xsl:stylesheet>

  7. 於Project explore中,對新建立的transform2.xsl按右鍵—>Run As—>XSL Transformation
    image
  8. Eclipse會跳出一個視窗,選取要轉換的XML檔案
    image 
  9. 轉換的結果會存在同目錄下的 source.out.xml檔案內

翻譯自 http://www.vogella.de/articles/XSLT/article.html

2011年6月9日 星期四

客製化Sun的JAXB implemtation--XJC

使用Sun的XJC建立Java code時,預設遇xml schema中有fixed attribute時,不會自動把它轉成Java的constant,要達到這個目的,必需客製化XJC的 binding方式。作法如下(XJC提供inline及external的customization,其中inline的客製化是直接把客製化設定寫在要進行轉換的xml schema中;而exetrnal的customization則是另外寫在一個外部檔案,這裡使用external customization為例子)

  1. 撰寫customization檔案(xjc根目錄下的 samples/external-customize 子目錄有更詳細的例子)
       <jxb:bindings version="1.0"
                xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <jxb:bindings schemaLocation="ExercisePrescription - reference - 20110530 hugang.xsd" node="/*">
      <jxb:globalBindings
        fixedAttributeAsConstantProperty="true"/>
      </jxb:bindings>
    </jxb:bindings>
  2. 執行轉換指令
    xjc   xml_schema_to_convert     -b   customization_file_name
  3. 如此一來,xjc在轉換java code時,會把fixed value轉成java constant

2011年1月6日 星期四

使用JAXB Parse XML

轉載自:http://www.javaworld.com.tw/jute/post/view?bid=19&id=5482&sty=1&tpg=1&age=-1

相信正常一點的程式設計人員都覺得XML很煩
如果你是技術狂,那就算了,當我沒說 :p
通常我們只是想要讀一個能跨平台的文件
幹嘛要去了解一堆有的沒的定義及如何parse文件的東東
為什麼不讓這些煩人的事情包裝起來
我們只要關心我讀進來的資料該如何處理
處理完再把它順利的寫回就好哩
這個念頭相信在大家的心中都出現過
所以恭喜大家,前人已經幫我們種好樹了
大家趕快到樹下乘涼吧
JAXB就是我們要的東東
Java Architecture for XML Binding (JAXB)
簡單的講就是提供了一個自動在xml文件與java物件mapping的機制
所以我們不用去了解啥米弟踢弟、死雞碼該如何定義
也不用學習如何去吹薩克斯風或挖洞給自已跳
首先要下載Java Web Services Developer Pack
其中便包含有JAXB的實作套件
接下來要設定相關的環境變數
範例如下:
set JAVA_HOME=your_jdk_home_path
set JWSDP_HOME=your_jwsdp_home_path
set JAXB_HOME=%JWSDP_HOME%\jaxb-1.0
set JAXB_LIBS=%JAXB_HOME%\lib
set JAXP_LIBS=%JWSDP_HOME%\jaxp-1.2.2\lib
set JWSDP_LIBS=%JWSDP_HOME%\jwsdp-shared\lib
set PATH=%JAXB_HOME%\bin;%JWSDP_HOME%\jwsdpshared\bin;%PATH%
以下請自行連結為一行
set CLASSPATH=%JAXB_LIBS%\jaxb-api.jar;
%JAXB_LIBS%\jaxb-ri.jar;%JAXB_LIBS%\jaxb-xjc.jar;
%JAXB_LIBS%\jaxb-libs.jar;
%JAXP_LIBS%\jaxb-api.jar;
%JAXP_LIBS%\endorsed\xercesImpl.jar;
%JAXP_LIBS%\endorsed\xalan.jar;
%JAXP_LIBS%\endorsed\sax.jar;
%JAXP_LIBS%\endorsed\dom.jar;
%JWSDP_LIBS%\jax-qname.jar;
%JWSDP_LIBS%\namespace.jar;.;
接下來我們一步步來看該如何使用JAXB
首先要先綁架xml schema
透過JAXB所提供的工具xjc
可產生一組用以描述xml schema的Java介面及實作類別
xjc指令格式如下:
xjc -p <generated_package> -d <target_directory> xml_schema
例如:
xjc -p test.jaxb -d work_area books.xsd
接著要編譯所產生的介面及實作類別
javac test/jaxb/*.java test/jaxb/impl/*.java
再來就可試著透過Unmarshal的方式來取得xml文件裡的資料
可以在測試程式中撰寫類似以下程式碼
JAXBContext jc = JAXBContext.newInstance("test.jaxb");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Collection collection =
(Collection)unmarshaller.unmarshal(new File( "books.xml"));
CollectionType.BooksType booksType = collection.getBooks();
List bookList = booksType.getBook();
然後就可以取出xml文件裡的資料
for( int i = 0; i < bookList.size();i++ ) {
test.jaxb.BookType book =(test.jaxb.BookType) bookList.get(i);
System.out.println("Item id: " + book.getItemId());
System.out.println("Book Name: " + book.getName().trim());
}
另外也可利用
unmarshaller.setValidating(true);
來指定是否要在Unmarshal的同時來驗證此份xml文件格式正確與否
再來就可試著透過Marshal的方式來將資料寫到所指定的xml文件裡
可以在測試程式中撰寫類似以下程式碼
JAXBContext jaxbContext = JAXBContext.newInstance("test.jaxb");
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT ,
new Boolean(true));
ObjectFactory objFactory = new ObjectFactory();
Collection collection= (Collection) objFactory.createCollection();
Collection.BooksType booksType = objFactory.
createCollectionTypeBooksType();
List bookList = booksType.getBook();
BookType book = objFactory.createBookType();
book.setItemId("777");
book.setName("JAXB簡介");
然後就可以將資料寫入我們所指定的xml文件裡
bookList.add(book);
collection.setBooks(booksType);
marshaller.marshal(collection,
new FileOutputStream("jaxb_test.xml"));
另外也可利用Validator類別來驗證此份xml文件格式正確與否
範例如下:
Validator validator = jaxbContext.createValidator();
validator.validate(collection));
若您還想知道更多關於JAXB使用上的細節,請上官方網站喔 ^_^
http://java.sun.com/xml/jaxb/
*********************無版權宣告*********************
版權沒有,歡迎轉載
轉載時請保留作者姓名及此份宣告
本文是為了方便新手入門學習
歡迎大家給小弟指正或補充更多詳盡的資料
my email: iampoya@pchome.com.tw
本文同步刊於
http://www.javaworld.com.tw
http://www.midicat.com/poya/ezjava