国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用XMLBeans 處理XML

2019-11-18 11:22:15
字體:
來源:轉載
供稿:網友

一.xmlBeans

基于XML開發的技術很多,常見的如Dom4j(JBoss用),Castor,Common-Degister(Struts用),XMLBeans.關于這些的比較網上很多.這里談談XMLBeans的用法.

XMLBeans的官方地址(http://xmlbeans.apache.org/).上面有它的具體介紹和用法.

 

二 適用的場合

從使用的經驗來看,XMLBeans比較適合處理具有復雜Schema定義的xml,如SAML,Liberty等.而簡單的XML結構用Dom4j或者Castor XML Mapping 都很輕易處理.

因此假如你要處理一個很復雜的Schema定義,選擇XMLbeans就比較好.

 

三. XMLBeans 的使用過程

1.要熟悉XML Schema. 這本書值得推薦: XML 模式權威教程 http://www.china-pub.com/computers/common/info.asp?id=8908)

 

2.從Schema 自動映射到 java 對象.

這個步驟可以用XMLbeans的生成工具.

相關的Maven腳本如下:

         <!--==================================================================-->

<!-- XMLBeans                                                         -->

<!--==================================================================-->

<goal descr<echo>+---------------------------------------------------+</echo>

<echo> XMLBeans genreating.......                       </echo>

<echo>+---------------------------------------------------+</echo>

<taskdef name="xmlbean"

classname="org.apache.xmlbeans.impl.tool.XMLBean"

classpathref="maven.dependency.classpath"/>

<xmlbean srcgendir="${project.xmlbeans.srcgendir}"

classgendir="${project.xmlbeans.classgendir}"

destfile="${project.xmlbeans.destfile}" debug="true"

classpathref="maven.dependency.classpath" >

<fileset dir="${project.xmlbeans.schemas}" />

</xmlbean>

<!--

<path id="{maoxiang.xmlbeans.srcgendir" location="${maoxiang.xmlbeans.srcgendir}"/>

<maven:addPath id="maven.compile.src.set" refid="maoxiang.xmlbeans.srcgendir"/>

-->

</goal>

 

這個腳本調用XMLBeans的ant腳本(看xmlbeans文檔),生成了一個可以處理Schema的框架.

 

3. 使用XMLBeans 解析 xml

根據Schema的生成框架,就可以處理符合該Schema定義的XML實例了.這點和Eclipse下的EMF框架十分類似.

XMLBeans框架的兩個最重要的方法:

a) Factory 用來解析XML的,如 PortletAPPType portletApp = PortletAppType.Factory.parse(file); 需要提醒的是,
  one: parse 的參數雖然可以是各種類型,不過最好是 Stream型. 假如直接是File型,在web環境下,會報錯為 Content is not allowed  in prolog.

  two: 在Jboss下使用時,不需要使用jaxen這個包.
b) XmlText() 可以將對象的數據導出為xml格式,而且不一定是要根元素.

看看下面的代碼片斷:

  從 portlet.xml中讀取啟動參數.

       public static Properties getInitParamProps(PortletType portlet) {

Properties props = new Properties();

 

InitParamType[] inits = portlet.getInitParamArray();

 

for (int i = 0; i < inits.length; i++) {

props.setProperty(inits[i].getName().getStringValue(), inits[i]

.getValue().getStringValue());

}

return props;

}

 

 

4.總結

使用XMLBeans處理XML,簡單.高效(可以看看xmlbeans架構師的blog:http://davidbau.com/).比較難的在于假如要處理簡單的xml結構,你還得定義一個schema方便自動產生xmlbeans框架. 而Schema本身就是一種語言,建議采用 XML Spy(home edition 是免費的) 來編寫Schema.

下面這個Schema就是我的Portal Layout的Schema,用XMLBeans來處理的效果很好.

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:portal="http://maoxiang/portal" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://maoxiang/portal" elementFormDefault="unqualified">

<xsd:complexType name="baseType" abstract="true">

<xsd:sequence>

<xsd:element name="preference" type="portal:preferenceType" minOccurs="0" maxOccurs="unbounded">

<xsd:unique name="name-uniqueness">

<xsd:selector XPath="./preference"/>

<xsd:field xpath="name"/>

</xsd:unique>

</xsd:element>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType name="preferenceType">

<xsd:sequence>

<xsd:element name="name" type="xsd:string"/>

<xsd:element name="value" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

</xsd:sequence>

</xsd:complexType>

<!-- define the page layout -->

<xsd:element name="page" type="portal:pageType" />

<xsd:complexType name="pageType">

<xsd:complexContent>

<xsd:extension base="portal:baseType">

<xsd:sequence>

<xsd:element name="create-time" type="xsd:dateTime"/>

<xsd:element name="page-title" type="xsd:string"/>

<xsd:element name="page-width" type="xsd:string"/>

<xsd:element name="page-language" type="xsd:language"/>

<xsd:element name="page-refresh" type="xsd:integer"/>

<xsd:element name="page-style" type="portal:styleType"/>

<xsd:element name="page-layout" type="portal:layoutType"/>

</xsd:sequence>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="styleType">

<xsd:complexContent>

<xsd:extension base="portal:baseType">

<xsd:sequence>

<xsd:element name="CSS" type="xsd:string"/>

</xsd:sequence>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="layoutType">

<xsd:complexContent>

<xsd:extension base="portal:baseType">

<xsd:sequence>

<xsd:element name="row" type="portal:rowType" minOccurs="0" maxOccurs="unbounded">

<xsd:unique name="row_uuid">

<xsd:selector xpath="."/>

<xsd:field xpath="@id"/>

</xsd:unique>

</xsd:element>

</xsd:sequence>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="rowType">

<xsd:complexContent>

<xsd:extension base="portal:baseType">

<xsd:sequence>

<xsd:element name="col" type="portal:colType" minOccurs="0" maxOccurs="unbounded">

<xsd:unique name="col_uuid">

<xsd:selector xpath="."/>

<xsd:field xpath="@id"/>

</xsd:unique>

</xsd:element>

</xsd:sequence>

<xsd:attribute name="id" type="xsd:string" use="required"/>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="colType">

<xsd:complexContent>

<xsd:extension base="portal:baseType">

<xsd:sequence>

<xsd:element name="unit" type="portal:unitType" minOccurs="0" maxOccurs="unbounded">

<xsd:unique name="unit_uuid">

<xsd:selector xpath="."/>

<xsd:field xpath="@id"/>

</xsd:unique>

</xsd:element>

</xsd:sequence>

<xsd:attribute name="id" type="xsd:string" use="required"/>

<xsd:attribute name="width" type="xsd:string" use="required"/>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

<xsd:complexType name="unitType">

<xsd:complexContent>

<xsd:extension base="portal:baseType">

<xsd:sequence>

<xsd:element name="portlet-id" type="xsd:string"/>

</xsd:sequence>

<xsd:attribute name="id" type="xsd:string" use="required"/>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

</xsd:schema>

 

 

 



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌平区| 高雄县| 合江县| 泸西县| 织金县| 齐河县| 江油市| 尼木县| 洪湖市| 田东县| 喜德县| 江阴市| 金平| 尚义县| 甘孜| 临夏县| 岳普湖县| 泽普县| 苍山县| 凌源市| 建瓯市| 镇原县| 布尔津县| 岚皋县| 阿尔山市| 哈巴河县| 大方县| 石城县| 赤峰市| 河池市| 宁德市| 兰考县| 礼泉县| 新龙县| 曲靖市| 论坛| 兰考县| 葫芦岛市| 内乡县| 肥东县| 富川|