andyj2ee

java tec sky

统计

留言簿(4)

activemq

aop

design pattern

other blog

spring

workflow

多线程

软件架构师

阅读排行榜

评论排行榜

使用XMLBeans 进行java 数据梆定

进入实践之前,最好找篇文章先了解一下 xmlbeans 是用来做什么的
参考资料:http://xmlbeans.apache.org/
参考文章:XML-Java Data Binding Using XMLBeans

xmlbeans bea 贡献的一个开源项目,目的是使xml 文件直接转化为java 对象,对java 对象的操作可直接存为xml 文件,省去了文档验证过程。
实现原理:先定义 xml schema descripter ,编译定义的 *.xsd 文件,引入编译后生成的.jar 包。与 xmlbeans-Home\lib\xbean.jar  就可以在开发项目中使用了。

  1. Install XMLBeans.
  2. Compile your schema. Use scomp to compile the schema, generating and jarring Java types. For example, to create a employeeschema.jar from an employeesschema.xsd file:
    scomp -out employeeschema.jar employeeschema.xsd
  3. Write code. With the generated JAR on your classpath, write code to bind an XML instance to the Java types representing your schema. Here's an example that would use types generated from an employees schema:
    File xmlFile = new File("c:\employees.xml"); 
    
    // Bind the instance to the generated XMLBeans types.
    EmployeesDocument empDoc = 
    	EmployeesDocument.Factory.parse(xmlFile); 
    
    // Get and print pieces of the XML instance.
    Employees emps = empDoc.getEmployees(); 
    Employee[] empArray = emps.getEmployeeArray(); 
    for (int i = 0; i < empArray.length; i++) 
    { 
    	System.out.println(empArray[i]); 
    }
实践中遇到的问题:
如何修改编译shema 产生的java 类的package 目录结构?


参考:http://wiki.apache.org/xmlbeans/XmlBeansFaq#configPackageName

Can I change the default package names for the java classes generated from my schema?

You can create a file that ends in .xsdconfig to map targetnamespace to packagename. Put the .xsdconfig file in the same directory as the .xsd that you are compiling. Here is an example .xsdconfig:

<!-- An xsdconfig file must begin with a "config" element in the 
        http://www.bea.com/2002/09/xbean/config namespace. Also, be sure
        to declare any namespaces used to qualify types in your schema (here,
        the namespace corresponding to the pol prefix. -->
<xb:config xmlns:pol="http://openuri.org/easypoLocal" 
    xmlns:xb="http://www.bea.com/2002/09/xbean/config">

    <!-- Use the "namespace" element to map a namespace to the Java package
        name that should be generated. -->
    <xb:namespace uri="http://openuri.org/easypoLocal">
        <xb:package>org.openuri.easypo.xsdconfig</xb:package>
    </xb:namespace>

    <!-- Use the "qname" element to map schema type names to generated
        Java type names. In these examples, the name attribute's value is the
        XML element name; the javaname attribute's value is the Java type 
        that should be generated. -->
    <xb:qname name="pol:CUST" javaname="Customer"/>
    <xb:qname name="pol:PURCH_ORDER" javaname="PurchaseOrder"/>
</xb:config>

Notice that you can also map specific element/attribute names to java names.

/!\ Note: If schema doesn't include targenamespace then use

<xb:namespace uri="##any">
  <xb:package>org.openuri.easypo.xsdconfig</xb:package>
</xb:namespace>

to specify package names

/!\ Note: XmlBeans doesn’t support using two or more sets of java classes (in different packages) mapped to schema types/elements that have the same names and target namespaces, using all in the same class loader. Depending on the direction you are using for the java classes to schema types mapping, some features might not work correctly. This is because even though the package names for the java classes are different, the schema location for the schema metadata (.xsb files) is the same and contains the corresponding implementing java class, so the JVM will always pick up the first on the classpath. This can be avoided if multiple class loaders are used.


先看一下 scomp 命令: xmlbeans-home/bin 要加入到path 中,

scomp 参数图
编写自己的schema文件:weather_latlong.xsd
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ct
="http://beans.jhalo.com"
targetNamespace
="http://beans.jhalo.com"
elementFormDefault
="qualified">
<!-- This XML Schema describes xml documents
containing either weather details or latlong
details of a location based on Zipcode Two Global
elements Weather and Latlong, and one Global
Attribute Zipcode are declared.
-->
 
<xsd:element name="Weather">
  
<xsd:complexType>
   
<xsd:sequence>
    
<xsd:element name="Temperature"
         type
="xsd:float"/>
    
<xsd:element name="Humidity"
         type
="xsd:float"/>
    
<xsd:element name="Visibility"
         type
="xsd:float"/>
    
<xsd:element name="Datetime"
         type
="xsd:dateTime"/>
   
</xsd:sequence>
  
<xsd:attribute ref="ct:Zipcode"/>
 
</xsd:complexType>
 
</xsd:element>
 
<xsd:element name="Latlong">
  
<xsd:complexType>
   
<xsd:sequence>
    
<xsd:element name="Latitude"
         type
="xsd:string"/>
    
<xsd:element name="Longitude"
         type
="xsd:string"/>
    
</xsd:sequence>
   
<xsd:attribute ref="ct:Zipcode"/>
  
</xsd:complexType>
 
</xsd:element>
 
<xsd:attribute name="Zipcode"
         type
="xsd:string"/>
</xsd:schema>


#


2
编写myconfig.xsdconfig 存放同一目录


#
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config"
           xmlns:ct
="http://beans.jhalo.com">

  
<xb:namespace uri="http://beans.jhalo.com http://services.jhalo.com">
    
<xb:package>org.jhalo</xb:package>
  
</xb:namespace> 

  
<xb:namespace uri="##any">
    
<xb:prefix>Xml</xb:prefix>
    
<xb:suffix>Bean</xb:suffix>
  
</xb:namespace>


  
  
<xb:qname name="ct:Zipcode" javaname="Zip" /> 
  
<xb:qname name="ct:Datetime" javaname="Today" />


</xb:config>


如果不使用myconfig.xsdconfig 进行编译
scomp -out weather.jar weather_latlong.xsd 
生成的 weather.jar 为:com/jhalo/beans/xxxx


使用 .xsdconfig 编译
scomp -out weather.jar weather_latlong.xsd  myconfig.xsdconfig
生成jar 结构为: org/jhalo/

在写测试程序发现, Datetime -->Today 也改变了。
import org.apache.xmlbeans.*;
import org.jhalo.XmlLatlongDocumentBean;
import org.jhalo.XmlWeatherDocumentBean;


XmlWeatherDocumentBean wdoc;
XmlWeatherDocumentBean.Weather w;
wdoc 
= XmlWeatherDocumentBean.Factory.newInstance();
= wdoc.addNewWeather();
w.setToday(Calendar.getInstance());

完毕.:)~


方向:分布式系统设计

posted on 2006-02-14 16:13 java光环 阅读(1231) 评论(0)  编辑  收藏 所属分类: xml


只有注册用户登录后才能发表评论。


网站导航: