欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

jaxb读取包含有cdata的xml文件及相关错误解决

更新时间: 2014-01-05 02:01:42 责任编辑: Author_N1

 

JAXB读取包含有CDATA的XML文件及相关异常解决
xml不带命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Hello><![CDATA[Demo, <a href="http://www.google.com" target="_blank">Search</a> thank you]]></Hello>
</Root>

xml带命名空间
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.xbpm.org/ha3">
<Hello><![CDATA[Demo, <a href="http://www.google.com" target="_blank">Search</a> thank you]]></Hello>
</Root>

1,xsd可以用xml spy画出来。默认画出来不带命名空间。下面的命名空间是手工加上去的。如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v4.4 U (http://www.xmlspy.com) by msnmsn (abcd) -->
<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">
        <xs:element name="Root" type="tns:Root"/>
        <xs:complexType name="Root">
                <xs:sequence>
                        <xs:element name="Hello" type="tns:Hello"/>
                </xs:sequence>
        </xs:complexType>
        <xs:complexType name="Hello">
                <xs:simpleContent>
                        <xs:extension base="xs:string"/>
                </xs:simpleContent>
        </xs:complexType>
</xs:schema>

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

3,通过下面的测试代码测试:
public class TestMain {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xsr = new File("hatest.xml");
        Root demo = (Root) unmarshaller.unmarshal(xsr);

        System.out.println(demo.getHello().getValue());
    }

}


4,测试过程中发现如下异常:
Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.xbpm.org/ha3", local:"Root"). Expected elements are (none)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:556)
	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才能生成。如下:
<xs:complexType name="Hello">
                <xs:simpleContent>
                        <xs:extension base="xs:string"/>
                </xs:simpleContent>
        </xs:complexType>
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:01:42
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/4709/
本文WWW.DOC100.NET DOC100.NET版权所有。