XmlBeans解决的问题
随着企业应用程序的复杂性不断加剧,XML 文档的约束和规则变得越来越严格。此外,随着业界越来越迅速地采用 Web 服务,XML 开始成为跨越多种平台的不可忽视的重要角色。所有这一切意味着,应用程序迫切需要一种简单而强大的机制来处理 XML。
XMLBeans 提供了这样一种机制,可以将 XMLBeans 用于 XML 数据绑定。与其他只支持 W3C XML Schema 规范的某个子集的数据绑定技术不同,XMLBeans 支持完整的规范,从这方面来说,它非常强大。对于习惯于面向对象操作的开发人员来说,它还惊人地易用。
通过 XMLBeans,您可以使用 Java 类访问和操纵 XML 文档中包含的数据。
它是如何做到这些的呢?实际上,它包括两个步骤:
- XML 模式的对象表示。这种对象表示是一组普通的 Java 类和接口,用于表示模式的结构和约束。
- 符合上述模式的实际 XML 实例文档被绑定到第1步生成的 Java 类和接口的实例。绑定过程需要使用 XMLBeans API,以面向对象的方式访问真正的 XML 实例文档中的数据。
一旦 XMLBeans 编译器生成了和模式对应的一般 Java 类和接口,任何符合该模式的 XML 实例文档都可以使用这些类和接口绑定。XMLBeans 比传统的解析更进了一步,因为用户不再需要进行以下操作:
- 导航内存中的数据树中的每个节点。
- 编写回调方法,从 XML 文档中提取信息。(关于 XMLBeans 和解析的比较,请参阅本文后面的 XMLBeans 的优点。)
XmlBeans与常见Xml解析技术比较优势
XMLBeans 面临着传统解析和绑定技术的竞争,如 DOM、SAX、JAXB 和 Castor,但 XMLBeans 有一些独到之处。它们的比较如下:
- DOM 在内容中生成整个文档的树。如果文档非常大,DOM 就会变得对内存非常敏感,并会显著降低性能。通过增量解组(incremental unmarshalling)并提供xget 方法来访问内置的模式数据类型,XMLBeans 取得了较好的性能。
- 与 DOM 相比,SAX 对内存要求不高,但是 SAX 要求开发人员为事件处理程序编写回调方法,而 XMLBeans 则不需要。
- 与 XMLBeans 类似,JAXB 和 Castor 也都是 XML/Java 绑定技术,但它们都没有提供百分之百的模式支持。XMLBeans 最大的优势之一是几乎百分之百的支持 XML Schema。此外,XMLBeans 还能够访问完整的 XML Infoset,对于强调元素顺序或者注释的应用程序,这一点特别有用。
- XMLBeans 还提供了解析 XML 实例的即时验证。
- XMLBeans 包括一些创新的特性,如 XML 游标和对 XQuery 的支持。
以上内容转自IBMhttp://www.ibm.com/developerworks/cn/xml/x-beans1/
XmlBeans下载及安装
- 下载XmlBeans:Apache XmlBeans 官网地址:http://xmlbeans.apache.org/ ,可下载最新版本进行安装,本文使用2.5.0版本。
- XmlBeans运行环境须具备:JDK1.4以上及Ant,本文使用JDK1.6.0_01,及Ant1.8.4。Apache Ant 官网地址:http://ant.apache.org/ ,Ant安装请参考官方安装指南,此处不再敖述。
Windows安装
- 右键单击我的电脑,然后单击属性。
- 在高级选项卡,单击“环境变量”。
- 增加XMLBEANS_HOME变量,其值是XMLBeans根目录的位置。例如:"C:\技术\xmlbeans\xmlbeans-2.5.0"。
- 编辑 PATH变量,添加"%XMLBEANS_HOME%\ bin;"。
- 编辑 CLASSPATH变量,包括使用XMLBeans包括xbean.jar。
- 启动cmd,输入scomp -version会看到如下信息说明安装成功:
Apache Software Foundation, org.apache.xmlbeans.XmlBeans version 2.5.0-r882429
Unix/Linux安装
- export XMLBEANS_HOME=<location of XMLBeans root>
- export PATH=$PATH:$XMLBEANS_HOME/bin
- export CLASSPATH=$XMLBEANS_HOME/lib/xbean.jar:$CLASSPATH
(or, if you built XMLBeans from source,export CLASSPATH=$XMLBEANS_HOME/build/lib/xbean.jar:$CLASSPATH)
- For XMLBeans V2, export CLASSPATH=$CLASSPATH:$XMLBEANS_HOME/lib/jsr173[_1.0]_api.jar
(or, if you built XMLBeans from source,export CLASSPATH=$CLASSPATH:$XMLBEANS_HOME/build/lib/jsr173[_1.0]_api.jar)
Your updates might look like this:
export XMLBEANS_HOME=/home/me/xmlbeans-2.1.0 export PATH=$PATH:$XMLBEANS_HOME/bin export CLASSPATH=$XMLBEANS_HOME/lib/xbean.jar:$XMLBEANS_HOME/lib/jsr173_1.0_api.jar:$CLASSPATH
XmlBeans使用示例
- 创建prefs.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 数据库控制台设置 -->
<prefs>
<database>
<connection name="db2" driver="com.ibm.db2.jcc.DB2Driver"
url="jdbc:db2://localhost:50000/sample" user="sampl" password="sample"
default="true" />
<connection name="oracle" driver="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl" user="orcl" password="orcl" />
</database>
</prefs>
- 使用Xml SPY(一款非常好用的Xml编辑器)生成对应的xsd,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="prefs">
<xs:complexType>
<xs:sequence>
<xs:element ref="database"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="database">
<xs:complexType>
<xs:sequence>
<xs:element ref="connection" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="connection">
<xs:complexType>
<xs:attribute name="user" use="required">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="url" use="required">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="password" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:attribute>
<xs:attribute name="driver" use="required">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:attribute>
<xs:attribute name="default" type="xs:boolean"/>
</xs:complexType>
</xs:element>
</xs:schema>
- 创建xsdconfig文件,内容如下:
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
<xb:namespace>
<xb:package>com.innofi.component.dbconsole</xb:package>
</xb:namespace>
</xb:config>
- 使用命令创建jar包:
scomp -out ./build/prefs.jar ./schemas/prefs.xsd ./schemas/prefs.xsdconfig
- 将XmlBeans根目录下/lib下的jar包拷贝到项目中,编写测试类,内容如下:
package com.innofi.test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.xmlbeans.XmlException;
import com.innofi.component.dbconsole.ConnectionDocument.Connection;
import com.innofi.component.dbconsole.DatabaseDocument.Database;
import com.innofi.component.dbconsole.PrefsDocument;
import com.innofi.component.dbconsole.PrefsDocument.Prefs;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
public class TestXmlBeans {
public static List<Connection> read(String path) throws XmlException, IOException{
PrefsDocument document = PrefsDocument.Factory.parse(new File(path));
List <Connection> connnections = Arrays.asList(document.getPrefs().getDatabase().getConnectionArray());
return connnections;
}
public static void write(PrefsDocument document , Connection connection){
}
public static void main(String args[]) throws IOException, XmlException{
List<Connection> connections = read("C:/工作相关/产品研发/ProductResearch/develop_lib/dbconsole/WebContent/WEB-INF/prefs.xml");
for(Connection connection : connections){
System.out.println("name:["+connection.getName()+"]");
System.out.println("default:["+connection.getDefault()+"]");
System.out.println("url:["+connection.getUrl()+"]");
System.out.println("driver:["+connection.getDriver()+"]");
System.out.println("username:["+connection.getUser()+"]");
System.out.println("password:["+connection.getPassword()+"]");
}
PrefsDocument doc = PrefsDocument.Factory.newInstance();
Prefs prefs = doc.addNewPrefs();
Database database = prefs.addNewDatabase();
Connection connection = database.addNewConnection();
connection.setDefault(true);
connection.setDriver("driver");
connection.setName("test");
connection.setUser("user1");
connection.setPassword("password");
connection.setUrl("http://localhost");
doc.save(new File("e:/test.xml"));
}
}
- 控制台输出信息:
name:[db2]
default:[true]
url:[jdbc:db2://localhost:50000/sample]
driver:[com.ibm.db2.jcc.DB2Driver]
username:[sampl]
password:[sample]
name:[oracle]
default:[false]
url:[jdbc:oracle:thin:@localhost:1521:orcl]
driver:[oracle.jdbc.OracleDriver]
username:[orcl]
password:[orcl]
- e:/test.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<prefs>
<database>
<connection default="true" driver="driver" name="test"
user="user1" password="password" url="http://localhost" />
</database>
</prefs>