开发总结-输出一个与某XML Schema相符合的XML文档

要求:输出一个与某XML Schema相符合的XML文档 

 

1. 开发环境

  • jdk1.6-u-11      (jdk-6-windows-i586.exe)
  • jaxb       (JAXB2_20080829.jar)
  • 开发工具:eclipse

2.执行流程

  •      将某给定XML Schema 通过运行jaxb的xjc.bat 自动生成若干符合schema中定义java 类文件 
  •      将生成的若干java 类文件复制到eclipse的java 源代码目录中,并将解压后lib文件夹下的jar文件添加到到eclipse的lib中
  •      操纵Java对象
  •      Java对象生成xml

其中操作Java对象:

        ObjectFactory factory = new ObjectFactory();

        //由该工厂类的实例来创建符合schema根元素的对象 如 RootC

        RootC root = factory.createRootC();

 

将Java对象写入一个XML文件

        JAXBContext jc = JAXBContext.newInstance("my.demo"); //my.demo为包名
        Marshaller marshaller=jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
        marshaller.marshal( root ,new FileOutputStream("test.xml"));  //将java对象写入一个名为test的XML文件

 

还可以由一个XML来生成Java对象的实例,如下,由customer.xml来生成CustomerBo类的一个bo 实例

        JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
        Unmarshaller u = jc.createUnmarshaller();
        JAXBElement customerE = (JAXBElement) u.unmarshal(new FileInputStream( "customer.xml"));
        CustomerBo bo = (CustomerBo) customerE.getValue();

 

参考:http://gjxcbbs.com.cn/thread-246-1-1.html

 

3.出现的问题:

 

a:exception is java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI needs 2.1 API.

字面意思就是现在使用的是JAXB 2.0的API,但是需要2.1的API。

解决办法:

首先在JDK的lib目录下新建endorsed目录(如果存在就不需要新建了)

然后把jaxws-api.jar 和jaxb-api.jar 拷贝endorsed目录下,问题解决。

若按上述做了之后确仍然报这个错误

是因为所使用的jdk版本低,把更新到jdk1.6u11即可。

参考:http://www.javaeye.com/wiki/topic/754039

 

b:unable to marshal type "lex.MessageType" as an element because it is missing an @XmlRootElement annotation

 这是一个Unmarshaller.unmarshal方法返回实际对象的类型问题。它根据Schema的格式,可能有两种不同的返回结果。

  • Example1.:

Schema定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="book">
   <xsd:complexType>
       <xsd:sequence>
       <xsd:element name="name" type="xsd:string"/>
       <xsd:element name="author" type="xsd:string"/>      
       <xsd:element name="ISBN" type="xsd:int"/>
       <xsd:element name="publisher" type="xsd:string"/>
       <xsd:element name="edition" type="xsd:int"/>
       <xsd:element type="xsd:double" name="price"/>
       </xsd:sequence>
    </xsd:complexType>
</xsd:element>
</xsd:schema>

这个例子解析后实际返回xml文档根元素类型的实例 

  • Example 2:

Schema定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="book" type="BookType"></xsd:element>
<xsd:complexType name="BookType">
   <xsd:sequence>
      <xsd:element name="name" type="xsd:string"/>
      <xsd:element name="author" type="xsd:string"/>      
      <xsd:element name="ISBN" type="xsd:int"/>
      <xsd:element name="publisher" type="xsd:string"/>
      <xsd:element name="edition" type="xsd:int"/>
      <xsd:element type="xsd:double" name="price"/>
    </xsd:sequence>
</xsd:complexType>
<xsd:element name="comment" type="xsd:string"/>
</xsd:schema>

 

这个例子解析后实际返回的是JAXBElement类型的一个实例。

分析后得出:在第一个例子中,JAXB框架可以根据xml schema确定出xml文档的根元素,因为在解析时可以直接返回根元素类型的实例。而在第二个例子中,JAXB框架无法确定xml文档的根元素,因此在解析时就只能返回JAXBElement类型的实例了。在第一个例子中,生成的java类中可以看到@XmlRootElement(name = "book") anonation,但是第二个例子就没有。

 

解决办法:若Schema定义与第一个例子相符,则在生成的根元素java类中的anonation区域里添加@XmlRootElement即可

参考: http://blog.csdn.net/zhigangsun/archive/2008/07/23/2698810.aspx

参考:http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html

 

[实验目的] 1、学习如何使用XMLSPY集成开发环境完成XML Schema相关的开发工作。 2、掌握XML Schema与DTD之间的区别,能够完成两者之间的转换;掌握在XML Schema中如何定义元素和属性,如何使用限制、列表和合并派生自己的简单数据类型,如何定义复杂数据类型,全局/局部元素和数据类型之间的区别;如何将XML Schema文档关联到XML实例数据文档,并完成文档的有效性验证。 3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,新建XML Schema文档,在各种不同的编辑视图中尝试采用不同的方式完成XML Schema文档的编辑和查看;并使用XMLSPY提供的便利,建立XMLSchema两者之间的关联,进行XML文档的良构以及有效性验证。 2、严格按照下图给出的文档模型,在XML Schema编辑环境的Schema视图中完成book.xsd的编写(不要使用Text视图进行编写): 在上图中,没有指定简单类型元素和属性的数据类型,请根据合理的情况,完成数据类型的创建(至少使用到限制方式中的三种以上的限制方面),请在IDE的Details视图->type和Facets中完成上述任务。 在上图中,有三个title元素分别表示book、section和figure的标题,请定义下述类型: titleType:1-100个字符的文本; bookTitleType:titleType类型限制派生的子类型,要求取枚举值“Data On the Web”、“TCP/IP Illustrated”等; sectionTitleType:titleType类型限制派生的子类型,要求必须形如“1.xxxx”、“1-1.xxxx”等等(表示第一节、第一节下面的第一节等等,注意section是递归的形式); figureTitleType:titleType类型限制派生的子类型,要求必须形如“1-1.xxxx” 、“1-1-1.xxxx”(表示第一节中的第一个图、第一节下面的第一节的第一个图等等); 然后编写book.xml,并使用多态性(即所有title的类型均为titleType,而数据实例中指明具体类型),请确保通过文档有效性验证。 3、在上次的DTD实验中,我们编写了SpyBase1.xml、SpyBase2.xml、以及SpyBase1.dtd和SpyBase2.dtd,这次需要完成SpyBase1.xsd和SpyBase2.xsd,建立模式与数据之间的关联,并进行文档有效性验证。在编写的XSD文档SpyBase1.xsd中,要求使用key/keyref描述数据的实体完整性以及数据之间的参照完整性(SpyBase2.xml不需要,因为已经使用嵌套消除了参照关系)。 [实验思考] 与ID/IDREF相比,key/keyref有哪些优点,在使用上有何不同? 假设SpyBase1.xml中的alias、mission、spy来自不同的命名空间中,如何在Schema中对其进行限定,请在XMLSPY中完成相应的xsd文档?修改SpyBase1.xml,并验证新的SpyBase1_2.xsd是否正确? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交book.xsd、book.xml(使用多态)。 提交SpyBase1. xsd、SpyBase2. xsd。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值