[XML]XML与JavaBean的映射

原文链接:http://hi.baidu.com/charles_zhang/blog/item/30eaf750660b285a1038c2f1.html

1、XStream,XStream是codehaus上的一个开源项目,用于将Javabean serialize为xml格式,以及从xml中生成javabean。
2、castor、xmlbeans,castor和xmlbeans这种都是先定义schema,然后根据schema来generate java class,然后调用marshall和unmarshall方法来序列化javabean。这是属于重量级的方法,虽然功能强大,使用却不方便。如果你改了schema,势必要重新generate,这样你就不能在generate的java class上加上自己的方法。导致生成的java class纯粹用于serialize。
3、 commons的betwikt也具有类似的功能,但好像需要配置rule,显得还是稍微麻烦些。

根据xml 的schema生成对应的数据映射类示例,利用Castor

schema文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2006 sp2 U (http://www.altova.com) by chris (grt) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="ExportedFile">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="username" type="xs:string"/>
<xs:element name="userpass" type="xs:string"/>
<xs:element ref="columnNames" minOccurs="0" maxOccurs="1"/>
<xs:element ref="records" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="columnNames">
<xs:complexType>
<xs:sequence>
<xs:element name="columnName" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element ref="record" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="record">
<xs:complexType>
<xs:sequence>
<xs:element name="field" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
知识点:
Schema共有8种元素:<Schema>、<ElementType>、<element>、< group>、<AttributeType>、<attribute>、<datatype>和< description>。这些元素对XML中允许的语法和结构进行了定义。Schema文件与其他的XML文档结构非常相似,根元素为<Schema>,表明文档类型。 其中属性name指定Schema名称,xmlns指定所属名称空间。第一个xmlns指定全文的缺省名称空间,第二个定义了文档中可使用的数据类型的名称空间。

<element>元素与〈ElementType〉中的name属性完全一致。minOccurs和maxOccurs属性分别指定了元素出现的最少和最多次数,默认值都为1。minOccurs为0说明元素是可选的,maxOccurs为*说明元素出现的次数不受限制。

<attribute>元素取值要与<AttributeType>中的name属性完全一致; required说明该属性对于引用它的元素是否为必要的; default指定属性类型的缺省值。如果对同一属性的<AttributeType>和<attribute>中相对应的 default和required属性都给出了定义,那么<attribute>的优先级别更高,以它的取值为准。

其对应的xml文件格式,如下:
<?xml version="1.0" encoding="GB2312"?>
<!--Sample XML file edited by lizongbo-->
<userinfo xmlns="user" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ExportedFile>
<username>d</username>
<userpass>dd</userpass>
<columnNames>
<columnName>d</columnName>
<columnName>dd</columnName>
</columnNames>
<record>
<records>
<field>
<name>dd</name>
</field>
</record>
</records>
</ExportedFile>


利用ant生成,其代码段示例为:

<target name="generateCastorClasses" depends=".">
<java classname="org.exolab.castor.builder.SourceGenerator">
<arg line="-dest '${dir}/source' -i '${dir}/config/Export.xsd' -f -package com.object" />
<classpath>
<fileset dir="${dir}/lib">
<include name="*.jar" />
</fileset>
</classpath>
</java>
</target>
其中,dir为工程目录,schema文件放在工程目录下的config目录中。生成的java文件放在工程目录下的source目录中,名字空间为com.object

把xml转换成映射类,调用生产类的方法unmarshal(根据xml实例化映射对象)或者marshal(根据映射对象生成xml文件)
前者的简单示例代码为:
ExportedFile exportedFile = (ExportedFile) TWIssues.unmarshal(new InputStreamReader(file
.getInputStream(),"GBK"));
其中,file为xml文件

你可能感兴趣的:(java,xml,schema,String,extension,encoding)