<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    [轉]利用XMLBean輕輕松松讀寫XML

    版權聲明:本文可以自由轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
    作者:葉楓(http://blog.matrix.org.cn/page/葉楓)
    原文:[http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html]http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html[/url]
    關鍵字:XML XMLBean Parser

    一、關于XML解析

    ??XML在Java應用程序里變得越來越重要, 廣泛應用于數據存儲和
    交換. 比如我們常見的配置文件,都是以XML方式存儲的. XML還應用
    于Java Message Service和Web Services等技術作為數據交換.
    因此,正確讀寫XML文檔是XML應用的基礎.
    ??Java提供了SAX和DOM兩種方式用于解析XML,但即便如此,要讀寫一個
    稍微復雜的XML,也不是一件容易的事.

    二、XMLBean簡介

    ????Hibernate已經成為目前流行的面向Java環境的對象/關系數據庫映射工具.
    在Hibernate等對象/關系數據庫映射工具出現之前,對數據庫的操作是
    通過JDBC來實現的,對數據庫的任何操作,開發人員都要自己寫SQL語句
    來實現. 對象/關系數據庫映射工具出現后,對數據庫的操作轉成對
    JavaBean的操作,極大方便了數據庫開發. 所以如果有一個類似的工具能夠
    實現將對XML的讀寫轉成對JavaBean的操作,將會簡化XML的讀寫,即使對XML
    不熟悉的開發人員也能方便地讀寫XML. 這個工具就是XMLBean.

    三、準備XMLBean和XML文檔

    ?? XMLBean是Apache的一個開源項目,可以從http://www.apache.org下載,
    最新的版本是2.0. 解壓后目錄如下:
    xmlbean2.0.0
    ???? +---bin
    ???? +---docs
    ???? +---lib
    ???? +---samples
    ???? +---schemas


    另外還要準備一個XML文檔(customers.xml),
    在本文的例子里,我們將對這個文檔進行讀寫操作. 文檔源碼如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Customers>
    ????<customer>
    ????????????<id>1</id>
    ????????????<gender>female</gender>
    ????????????<firstname>Jessica</firstname>
    ????????????<lastname>Lim</lastname>
    ????????????<phoneNumber>1234567</phoneNumber>
    ????????????<address>
    ????????????????<primaryAddress>
    ????????????????????????<postalCode>350106</postalCode>
    ????????????????????????<addressLine1>#25-1</addressLine1>
    ????????????????????????<addressLine2>SHINSAYAMA 2-CHOME</addressLine2>
    ????????????????</primaryAddress>
    ????????????????<billingAddress>
    ????????????????????????<receiver>Ms Danielle</receiver>
    ????????????????????????<postalCode>350107</postalCode>
    ????????????????????????<addressLine1>#167</addressLine1>
    ????????????????????????<addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
    ????????????????</billingAddress>
    ????????????</address>
    ????</customer>
    ????<customer>
    ????????????<id>2</id>
    ????????????<gender>male</gender>
    ????????????<firstname>David</firstname>
    ????????????<lastname>Bill</lastname>
    ????????????<phoneNumber>808182</phoneNumber>
    ????????????<address>
    ????????????????<primaryAddress>
    ????????????????????????<postalCode>319087</postalCode>
    ????????????????????????<addressLine1>1033 WS St.</addressLine1>
    ????????????????????????<addressLine2>Tima Road</addressLine2>
    ????????????????</primaryAddress>
    ????????????????<billingAddress>
    ????????????????????????<receiver>Mr William</receiver>
    ????????????????????????<postalCode>672993</postalCode>
    ????????????????????????<addressLine1>1033 WS St.</addressLine1>
    ????????????????????????<addressLine2>Tima Road</addressLine2>
    ????????????????</billingAddress>
    ????????????</address>
    ????</customer>
    </Customers>


    這是一個客戶的數據模型,每個客戶都有客戶編號(ID),姓名,性別(gender),
    電話號碼(phoneNumber)和地址,其中地址有兩個: 首要地址(PrimaryAddress)
    和帳單地址(BillingAddress),每個地址有郵編,地址1,和地址2組成.
    其中帳單地址還有收件人(receiver).

    ????此外,還要準備一個配置文件(文件名customer.xsdconfig),這個文件的
    作用我后面會講,它的內容如下:

    <xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">

    ??<xb:namespace>
    ????<xb:package>sample.xmlbean</xb:package>
    ??</xb:namespace>

    </xb:config>


    四、XMLBean使用步驟

    ????和其他面向Java環境的對象/關系數據庫映射工具的使用步驟一樣,
    在正式使用XMLBean前,我們要作兩個準備.

    ????1. 生成XML Schema文件

    ?????? 什么是XML Schema文件? 正常情況下,每個XML文件都有一個Schema文件,
    ?????? XML Schema文件是一個XML的約束文件,它定義了XML文件的結構和元素.
    ?????? 以及對元素和結構的約束. 通俗地講,如果說XML文件是數據庫里的記錄,
    ?????? 那么Schema就是表結構定義.

    ?????? 為什么需要這個文件? XMLBean需要通過這個文件知道一個XML文件的
    ?????? 結構以及約束,比如數據類型等. 利用這個Schema文件,XMLBean將會產生
    ?????? 一系列相關的Java Classes來實現對XML的操作. 而作為開發人員,則是
    ?????? 利用XMLBean產生的Java Classes來完成對XML的操作而不需要SAX或DOM.

    ?????? 怎樣產生這個Schema文件呢? 如果對于熟悉XML的開發人員,可以自己來
    ?????? 寫這個Schema文件,對于不熟悉XML的開發人員,可以通過一些工具來完成.
    ?????? 比較有名的如XMLSPY和Stylus Studio都可以通過XML文件來生成Schema
    ?????? 文件. 加入我們已經生成這個Schema文件(customer.xsd):
    ??????

    ?????? <?xml version="1.0" encoding="UTF-8"?>
    ?????? <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    ??????????????????elementFormDefault="qualified">
    ???????? <xs:element name="Customers">
    ?????????? <xs:complexType>
    ???????????? <xs:sequence>
    ?????????????? <xs:element maxOccurs="unbounded" name="customer"
    ?????????????????????????? type="customerType"/>
    ???????????? </xs:sequence>
    ?????????? </xs:complexType>
    ???????? </xs:element>
    ?????? <xs:complexType name="customerType">
    ???????????? <xs:sequence>
    ?????????????? <xs:element name="id" type="xs:int"/>
    ?????????????? <xs:element name="gender" type="xs:string"/>
    ?????????????? <xs:element name="firstname" type="xs:string"/>
    ?????????????? <xs:element name="lastname" type="xs:string"/>
    ?????????????? <xs:element name="phoneNumber" type="xs:string"/>
    ?????????????? <xs:element name="address" type="addressType"/>
    ???????????? </xs:sequence>
    ?????? </xs:complexType>
    ???????? <xs:complexType name="addressType">
    ???????????? <xs:sequence>
    ?????????????? <xs:element name="primaryAddress" type="primaryAddressType"/>
    ?????????????? <xs:element name="billingAddress" type="billingAddressType"/>
    ???????????? </xs:sequence>
    ???????? </xs:complexType>

    ???????? <xs:complexType name="primaryAddressType">
    ???????????? <xs:sequence>
    ?????????????? <xs:element name="postalCode" type="xs:string"/>
    ?????????????? <xs:element name="addressLine1" type="xs:string"/>
    ?????????????? <xs:element name="addressLine2" type="xs:string"/>
    ???????????? </xs:sequence>
    ???????? </xs:complexType>
    ???????? <xs:complexType name="billingAddressType">
    ???????????? <xs:sequence>
    ?????? ????????????<xs:element name="receiver" type="xs:string"/>
    ?????????????? <xs:element name="postalCode" type="xs:string"/>
    ?????????????? <xs:element name="addressLine1" type="xs:string"/>
    ?????????????? <xs:element name="addressLine2" type="xs:string"/>
    ???????????? </xs:sequence>
    ???????? </xs:complexType>
    ?????? </xs:schema>
    ??????


    ????2. 利用scomp來生成Java Classes

    ?????? scomp是XMLBean提供的一個編譯工具,它在bin的目錄下. 通過這個工具,
    ?????? 我們可以將以上的Schema文件生成Java Classes.
    ?????? scomp的語法如下:-

    ??????

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


    ?????? 主要參數說明:
    ?????? -src [dir]??????????????????-- 生成的Java Classes存放目錄
    ???? -srconly??????????????????-- 不編譯Java Classes,不產生Jar文件
    ???? -out [jarFileName]??-- 生成的Jar文件,缺省是xmltypes.jar
    ?????? -compiler???????????????? -- Java編譯器的路徑,即Javac的位置
    ?????? schemaFile.xsd????-- XML Schema文件位置
    ?????? config.xsdconfig?? -- xsdconfig文件的位置, 這個文件主要用來制定生成的Java Class
    ??????????????????????????????的一些文件名規則和Package的名稱,在本文,package是sample.xmlbean

    ?????? 在本文,我是這樣運行的:
    ??????

    ?????? scomp -src build\src??-out build\customerXmlBean.jar schema\customer.xsd
    ???????????? -compiler C:\jdk142_04\bin\javac customer.xsdconfig
    ??????


    ?????? 這個命令行的意思是告訴scomp生成customerXmlBean.jar,放在build目錄下,同時
    ?????? 生成源代碼放在build\src下, Schema文件是customer.xsd,xsdconfig文件是customer.xsdconfig.

    ?????? 其實, 生成的Java源代碼沒有多大作用,我們要的是jar文件.我們先看一下build\src\sample\xmlbean下生成的Classes.
    ??????

    ??????????CustomersDocument.java????-- 整個XML文檔的Java Class映射
    ?????? CustomerType.java??????????????-- 節點sustomer的映射
    ?????? AddressType.java???????????????? -- 節點address的映射
    ?????? BillingAddressType.java????????-- 節點billingAddress的映射
    ?????? PrimaryAddressType.java??????-- 節點primaryAddress的映射
    ????


    ?????? 好了,到此我們所有的準備工作已經完成了. 下面就開始進入重點:利用剛才生成的jar文件讀寫XML.

    五、利用XMLBean讀XML文件

    ????新建一個Java Project,將XMLBean2.0.0\lib\下的Jar文件和剛才我們生成的customerXmlBean.jar加入
    ????到Project的ClassPath.

    ????新建一個Java Class: CustomerXMLBean.??源碼如下:
    ????

    ????package com.sample.reader;

    ????import java.io.File;
    ????
    ????import sample.xmlbean.*;
    ????import org.apache.commons.beanutils.BeanUtils;
    ????import org.apache.xmlbeans.XmlOptions;
    ????public class CustomerXMLBean {
    ????private String filename = null;
    ????
    ????public CustomerXMLBean(String filename) {
    ????????????super();
    ????????????this.filename = filename;
    ????}

    ????public void customerReader() {
    ????????????try {
    ??????????????File xmlFile = new File(filename);
    ??????????????CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
    ??????????????CustomerType[] customers = doc.getCustomers().getCustomerArray();
    ??????????
    ??????????????for (int i = 0; i < customers.length; i++) {
    ????????????????CustomerType customer = customers[i];
    ????????????????println("Customer#" + i);
    ????????????????println("Customer ID:" + customer.getId());
    ????????????????println("First name:" + customer.getFirstname());
    ????????????????println("Last name:" + customer.getLastname());
    ????????????????println("Gender:" + customer.getGender());
    ????????????????println("PhoneNumber:" + customer.getPhoneNumber());
    ????????????????// Primary address
    ????????????????PrimaryAddressType primaryAddress = customer.getAddress().getPrimaryAddress();
    ????????????????println("PrimaryAddress:");
    ????????????????println("PostalCode:" + primaryAddress.getPostalCode());
    ????????????????println("AddressLine1:" + primaryAddress.getAddressLine1());
    ????????????????println("AddressLine2:" + primaryAddress.getAddressLine2());
    ????????????????// Billing address
    ????????????????BillingAddressType billingAddress = customer.getAddress().getBillingAddress();
    ????????????????println("BillingAddress:");
    ????????????????println("Receiver:" + billingAddress.getReceiver());
    ????????????????println("PostalCode:" + billingAddress.getPostalCode());
    ????????????????println("AddressLine1:" + billingAddress.getAddressLine1());
    ????????????????println("AddressLine2:" + billingAddress.getAddressLine2());
    ????????????
    ??????????????}
    ????????????} catch (Exception ex) {
    ????????????????????ex.printStackTrace();
    ????????????}
    ????}
    ????private void println(String str) {
    ??????????System.out.println(str);
    ????}
    ?? public static void main(String[] args) {
    ??????String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers.xml";
    ??????????????????
    ???? CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
    ?????????????????? customerXMLBean.customerReader();
    ????}

    ????}
    ????


    ????運行它,參看輸出結果:
    ????

    ?????? Customer#0
    ?????? Customer ID:1
    ?????? First name:Jessica
    ?????? Last name:Lim
    ?????? Gender:female
    ?????? PhoneNumber:1234567
    ?????? PrimaryAddress:
    ?????? PostalCode:350106
    ?????? AddressLine1:#25-1
    ?????? AddressLine2:SHINSAYAMA 2-CHOME
    ?????? BillingAddress:
    ?????? Receiver:Ms Danielle
    ?????? PostalCode:350107
    ?????? AddressLine1:#167
    ?????? AddressLine2:NORTH TOWER HARBOUR CITY

    ?????? Customer#1
    ?????? Customer ID:2
    ?????? First name:David
    ?????? Last name:Bill
    ?????? Gender:male
    ?????? PhoneNumber:808182
    ?????? PrimaryAddress:
    ?????? PostalCode:319087
    ?????? AddressLine1:1033 WS St.
    ?????? AddressLine2:Tima Road
    ?????? BillingAddress:
    ?????? Receiver:Mr William
    ?????? PostalCode:672993
    ?????? AddressLine1:1033 WS St.
    ?????? AddressLine2:Tima Road
    ????

    ????怎么樣,是不是很輕松? XMLBean的威力.

    六、利用XMLBean寫XML文件

    ????利用XMLBean創建一個XML文檔也是一件輕而易舉的事.我們再增加一個Method,
    ????請看一下的Java Class:
    ????

    ????public void createCustomer() {
    ????try {
    ????????// Create Document
    ????????CustomersDocument doc = CustomersDocument.Factory.newInstance();
    ????????// Add new customer
    ????????CustomerType customer = doc.addNewCustomers().addNewCustomer();
    ????????// set customer info
    ????????customer.setId(3);
    ????????customer.setFirstname("Jessica");
    ????????customer.setLastname("Lim");
    ????????customer.setGender("female");
    ????????customer.setPhoneNumber("1234567");
    ????????// Add new address
    ????????AddressType address = customer.addNewAddress();
    ????????// Add new PrimaryAddress
    ????????PrimaryAddressType primaryAddress = address.addNewPrimaryAddress();
    ????????primaryAddress.setPostalCode("350106");
    ????????primaryAddress.setAddressLine1("#25-1");
    ????????primaryAddress.setAddressLine2("SHINSAYAMA 2-CHOME");

    ????????// Add new BillingAddress
    ????????BillingAddressType billingAddress = address.addNewBillingAddress();
    ????????billingAddress.setReceiver("Ms Danielle");
    ????????billingAddress.setPostalCode("350107");
    ????????billingAddress.setAddressLine1("#167");
    ????????billingAddress.setAddressLine2("NORTH TOWER HARBOUR CITY");

    ????????File xmlFile = new File(filename);
    ????????doc.save(xmlFile);
    ????????} catch (Exception ex) {
    ????????????????ex.printStackTrace();
    ????????}

    ??}
    ????

    ????修改main method.
    ????

    ????public static void main(String[] args) {
    ????String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
    ????????CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
    ????????customerXMLBean.createCustomer();
    ????}
    ????

    ????運行,打開customers_new.xml:
    ????

    ????<?xml version="1.0" encoding="UTF-8"?>
    ????<Customers>
    ????<customer>
    ????????????<id>3</id>
    ????????????<gender>female</gender>
    ????????????<firstname>Jessica</firstname>
    ????????????<lastname>Lim</lastname>
    ????????????<phoneNumber>1234567</phoneNumber>
    ????????????<address>
    ????????????????????<primaryAddress>
    ???????????????????????? <postalCode>350106</postalCode>
    ???????????????????????? <addressLine1>#25-1</addressLine1>
    ?????????????????????????????????????? <addressLine2>SHINSAYAMA 2-CHOME</addressLine2>
    ????????????????????</primaryAddress>
    ????????????????????<billingAddress>
    ????????????????????????<receiver>Ms Danielle</receiver>
    ????????????????????????<postalCode>350107</postalCode>
    ?????????????????????? <addressLine1>#167</addressLine1>
    ?????????????????????? <addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
    ????????????????????</billingAddress>
    ????????????????????</address>
    ????????????</customer>
    ????</Customers>
    ????



    七、利用XMLBean修改XML文件

    ????我們再增加一個Method:
    ????

    ??????public void updateCustomer(int id,String lastname) {
    ???????? try {
    ????????File xmlFile = new File(filename);
    ????????CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
    ????????CustomerType[] customers = doc.getCustomers().getCustomerArray();
    ??????
    ????????for (int i = 0; i < customers.length; i++) {
    ?????????? CustomerType customer = customers[i];
    ??????????if(customer.getId()==id){
    ????????????????customer.setLastname(lastname);
    ????????????????break;
    ????????????}
    ????????}
    ????????doc.save(xmlFile);
    ???????? } catch (Exception ex) {
    ??????????ex.printStackTrace();
    ???????? }
    ?? ????????}
    ????

    ????main method:
    ????

    ????public static void main(String[] args) {
    ???? String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
    ????????????????????
    ????CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
    ????????????????????
    ????customerXMLBean.updateCustomer(3,"last");
    ????}
    ????

    ????運行之后,我們將會看到客戶編號為3的客戶的lastname已經改為last.

    八、利用XMLBean刪除一個customer

    ????再增加一個Method:
    ????

    ????public void deleteCustomer(int id) {
    ???? try {
    ??????File xmlFile = new File(filename);
    ???? CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
    ????CustomerType[] customers = doc.getCustomers().getCustomerArray();

    ?? for (int i = 0; i < customers.length; i++) {
    ????????CustomerType customer = customers[i];
    ????????if(customer.getId()==id){
    ????????????????????????customer.setNil() ;
    ????????????????????????break;
    ?????????????? }
    ?? }
    ?? doc.save(xmlFile);
    ?? } catch (Exception ex) {
    ????????ex.printStackTrace();
    ????????}
    ?? }


    ???????? main method:
    ????

    ????public static void main(String[] args) {
    ????String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
    ????????????????????
    ????CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
    ????????????????????
    ????customerXMLBean.deleteCustomer(3);
    ????}

    ????????
    運行,我們將會看到客戶編號為3的客戶的資料已經被刪除.

    九、查詢XML

    ????除了本文在以上講述的,利用XMLBean能輕輕松松完成XML的讀寫操作外,結合XPath和XQuery,
    ?? XMLBean還能完成象SQL查詢數據庫一樣方便地查詢XML數據. 關于XML查詢以及如何創建XML數據庫, 我將在另一篇文章里討論.



    十、結束語
    ????XMLBean能幫助我們輕易讀寫XML,這將有助于我們降低XML的學習和使用,有了這個基礎,
    ????開發人員將為學習更多地XML相關技術和Web Services,JMS等其他J2EE技術打下良好地基礎.


    關于作者:
    葉楓:熱愛Java和Oracle. 在軟件開發有近10年, 目前在國外一家美國大公司擔任SA, 負責技術研究。作者Blog:http://blog.matrix.org.cn/page/葉楓

    posted on 2006-03-30 09:53 扭轉乾坤 閱讀(163) 評論(0)  編輯  收藏 所屬分類: XML相關


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類(31)

    隨筆檔案(30)

    文章分類(32)

    文章檔案(33)

    相冊

    PHP小站-首頁

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲AV无码乱码麻豆精品国产| 日韩免费无码一区二区三区 | 亚美影视免费在线观看 | 国产亚洲精品自在线观看| 亚洲AV成人一区二区三区观看| 无码人妻久久一区二区三区免费丨| 亚洲成a人片在线不卡| 一区在线免费观看| 日本视频一区在线观看免费| 亚洲国产精品一区二区第一页免| 精品国产日韩亚洲一区在线| 亚洲AV无码成H人在线观看| 野花视频在线官网免费1| 亚洲国产电影av在线网址| 国产一二三四区乱码免费| 亚洲AV人人澡人人爽人人夜夜| 最新亚洲人成网站在线观看| 免费久久精品国产片香蕉| 亚洲一区二区三区精品视频| 成年大片免费视频| 男女超爽视频免费播放| 最新国产AV无码专区亚洲| 日韩精品内射视频免费观看| 亚洲AV色吊丝无码| 最近免费mv在线电影| 亚洲AV无码一区二区三区在线| 成人免费毛片观看| 一级毛片aaaaaa视频免费看| 国产黄色片在线免费观看| 二区久久国产乱子伦免费精品| 亚洲专区在线视频| 暖暖免费日本在线中文| 亚洲无人区视频大全| 全部免费国产潢色一级| 国内精品久久久久影院免费 | 国产免费啪嗒啪嗒视频看看| 久久免费视频一区| 亚洲精品偷拍视频免费观看| 精品亚洲福利一区二区| 日本免费电影一区| 国产午夜免费高清久久影院|