vlambda博客
学习文章列表

Java使用xml转化为JavaBean的xjc神器

Java中提供了xjc[xml java change]的应用。

在dos环境下我们可以通过xjc来转换schema约束至JavaBean的文件。和webservice中的wsdl转换java文件相类似,下面是我个人做的一个案例。


约束文件student.xsd

    <?xml version="1.0" encoding="UTF-8"?>      <!-- xmlns为schema的命名空间不可更改。但是可以更改前缀 -->      <!-- targetNamespace为自身的namespace,当xml引入约束的时候用到 -->      <!-- xmlns:tns   为方便自己类型在自己schema文档中引用而定义 -->      <schema xmlns="http://www.w3.org/2001/XMLSchema"               targetNamespace="http://www.example.org/classRom/01"              xmlns:tns="http://www.example.org/classRom/01"               elementFormDefault="qualified">          <element name="student" type="tns:studentType"></element>          <complexType name="studentType">              <sequence>                  <element name="name" type="string"></element>                  <element name="age" type="tns:ageType"></element>              </sequence>          </complexType>          <simpleType name="ageType">              <restriction base="int">                  <minInclusive value="1"></minInclusive>                  <maxExclusive value="100"></maxExclusive>              </restriction>          </simpleType>      </schema>  

约束文件classrom.xsd

 <?xml version="1.0" encoding="UTF-8"?>  <schema xmlns="http://www.w3.org/2001/XMLSchema"  targetNamespace="http://www.example.org/classRom/01"  xmlns:tns="http://www.example.org/classRom/01"  elementFormDefault="qualified">  <!-- 引入student.xsd来引用student中的约束 -->  <include schemaLocation="student.xsd"></include>  <element name="classrom" type="tns:classromType"></element>  <complexType name="classromType">  <sequence>  <element name="name" type="string"></element>  <sequence>  <element name="students" type="tns:studentType"></element>  </sequence>  </sequence>  </complexType>  </schema> 


xjc命令:

命令格式

xjc –d [转换文件至路径] –verbose [要转换的xsd约束]  

首先先在doc环境下进入xsd文件比较好操作



说明:“当出现连接关系的时候经常在schema文件中间引用同一个命名空间以达到元素公用的效果。比如上面的classrom和student”

在classrom中有student,但是我们不必重新来声明该元素。只需要在头文件保持namespace的同样运用即可。


注意:在Eclipse中编写调试xml提示:

window--->preference--->xml-->xml catelog 加入相应的xsd文件即可出现提示。

[加入之后尽量重启一下editor]




个人理解:

再多个系统共同应用中。在设计的时候要先建立标准。标准统一才能够达到交互数据的最大化。比如一个学校的各个系统教务、考试、报道。都需要共享学生数据,而如果共同设计的话我们必须要提前建立标准。这样也就可以手动编写wsdl标准。也就是xml标准


设置自定义的xml标签前缀与简单的请求案例(DHL下单):

  

 public static void main(String[] args) {
// JAVA 对象转xml文件 ObjectFactory factory = new ObjectFactory(); ShipmentRequest shipmentRequest = factory.createShipmentRequest();        。。。中间省略 JAXBContext jc = JAXBContext.newInstance(ShipmentRequest.class); NamespacePrefixMapper mapper = new PreferredMapper(); Marshaller ms = jc.createMarshaller();// ms.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper); ms.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
ms.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); ms.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.dhl.com ship-val-global-req.xsd"); ms.setProperty(Marshaller.JAXB_FRAGMENT, true); ByteArrayOutputStream os = new ByteArrayOutputStream();        ms.marshal(shipmentRequest, os); }
/** * 设置xml前缀 */ public static class PreferredMapper extends NamespacePrefixMapper {
@Override public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { return requirePrefix ? suggestion : "req"; } }