JAXB读取包含有CDATA的XML文件及相关异常解决

xml不带命名空间: 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Root>  
  3. <Hello><![CDATA[Demo, <a href="http://www.google.com" target="_blank">Search</a> thank you]]></Hello>  
  4. </Root>  


xml带命名空间 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Root xmlns="http://www.xbpm.org/ha3">  
  3. <Hello><![CDATA[Demo, <a href="http://www.google.com" target="_blank">Search</a> thank you]]></Hello>  
  4. </Root>  


1,xsd可以用xml spy画出来。默认画出来不带命名空间。下面的命名空间是手工加上去的。如下: 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!-- edited with XML Spy v4.4 U (http://www.xmlspy.com) by msnmsn (abcd) -->  
  3. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xbpm.org/ha3" xmlns:tns="http://www.xbpm.org/ha3" elementFormDefault="qualified" attributeFormDefault="unqualified">  
  4.         <xs:element name="Root" type="tns:Root"/>  
  5.         <xs:complexType name="Root">  
  6.                 <xs:sequence>  
  7.                         <xs:element name="Hello" type="tns:Hello"/>  
  8.                 </xs:sequence>  
  9.         </xs:complexType>  
  10.         <xs:complexType name="Hello">  
  11.                 <xs:simpleContent>  
  12.                         <xs:extension base="xs:string"/>  
  13.                 </xs:simpleContent>  
  14.         </xs:complexType>  
  15. </xs:schema>  


2,通过xjc命令,把xsd生成jaxb的java代码。 
xjc -p com.test ha.xsd 
带命名空间的,则会生成package-info.java. 

3,通过下面的测试代码测试: 

Java代码  收藏代码
  1. public class TestMain {  
  2.   
  3.     public static void main(String[] args) throws Exception {  
  4.         JAXBContext jc = JAXBContext.newInstance(Root.class);  
  5.   
  6.         Unmarshaller unmarshaller = jc.createUnmarshaller();  
  7.         File xsr = new File("hatest.xml");  
  8.         Root demo = (Root) unmarshaller.unmarshal(xsr);  
  9.   
  10.         System.out.println(demo.getHello().getValue());  
  11.     }  
  12.   
  13. }  



4,测试过程中发现如下异常: 

Java代码  收藏代码
  1. Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.xbpm.org/ha3", local:"Root"). Expected elements are (none)  
  2.     at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:556)  
  3.     at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:199)  



5,总结: 
1),如果xml中带命名空间,则对应的xsd也要带命名空间。 
2),xsd带命名空间,则会生成package-info.java。 
3),第4点提到的测试异常,可以通过在xjc生成的根类Root.java中,增加注解。如下: 
@XmlRootElement(name = "Root") 
4),带cdata的xml值,必须通过@XmlValue这个注解获取。而这个注解,xjc是根据下面这段xsd才能生成。如下: 

Java代码  收藏代码
    1. <xs:complexType name="Hello">  
    2.                 <xs:simpleContent>  
    3.                         <xs:extension base="xs:string"/>  
    4.                 </xs:simpleContent>  
    5.         </xs:complexType>  

posted on 2013-09-07 13:16  莫向  阅读(1098)  评论(0编辑  收藏  举报

导航