服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用xmlbeans 处理xml

.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 description="xmlbeans generate " name="project:xmlbeans-gen" >

<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>

 

这个脚本调用xmlbeansant脚本(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 layoutschema,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>

 

 

 

扫描关注微信公众号