JAXB读取包含有CDATA的XML文件及相关异常解决
2013-09-07 13:16
459 查看
xml不带命名空间:
Java代码
<?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带命名空间
Java代码
<?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画出来。默认画出来不带命名空间。下面的命名空间是手工加上去的。如下:
Java代码
<?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,通过下面的测试代码测试:
Java代码
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,测试过程中发现如下异常:
Java代码
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才能生成。如下:
Java代码
<xs:complexType name="Hello">
<xs:simpleContent>
<xs:extension base="xs:string"/>
</xs:simpleContent>
</xs:complexType>
Java代码
<?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带命名空间
Java代码
<?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画出来。默认画出来不带命名空间。下面的命名空间是手工加上去的。如下:
Java代码
<?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,通过下面的测试代码测试:
Java代码
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,测试过程中发现如下异常:
Java代码
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才能生成。如下:
Java代码
<xs:complexType name="Hello">
<xs:simpleContent>
<xs:extension base="xs:string"/>
</xs:simpleContent>
</xs:complexType>
相关文章推荐
- 解决structs2 找不到类 / structs.xml 文件在action class 部分读取出错异常
- EasyPlayerPro-Win 解决xml配置文件中特殊字符读取异常
- Lab 相关 ---- 无法读取项目文件 xxx.vcxproj 的解决方法
- System.Security.Cryptography.RSA.FromXmlString 系统找不到指定的文件和X509读取证书文件系统找不到指定的文件异常
- Android之PDF文件的读取——网络资源vudroid异常解决贴
- 自定义配置文件读取产生的“无法添加已属于该配置的 ConfigurationSection”异常解决办法
- 解决 IDEA 中src下xml等资源文件无法读取的问题
- 解决 IDEA 中src下xml等资源文件无法读取的问题
- ssh整合思想 Spring与Hibernate的整合ssh整合相关JAR包下载 .MySQLDialect添加了第57区的方言解决没有异常,hibernate.dialect核心配置文件就是无法自动update创建表
- 解决 IDEA 中src下xml等资源文件无法读取的问题
- jxl读取excel文件异常:Unable to recognize OLE stream 的解决方法
- 解决Myeclipse中导入epf文件之后xml及jsp等各种页面中的部分显示异常问题
- 读取含有命名空间xml文件内容
- (转)ibatis.net读取不到新建的xml文件解决
- JDOM 读取xml文件中的CDATA数据
- 静态方法中读取properties文件null异常解决方法
- Dom4j SAXReader读取xml异常时占用文件,导致不能移动文件
- 解决 IDEA 中src下xml等资源文件无法读取的问题
- 自定义配置文件读取产生的“无法添加已属于该配置的 ConfigurationSection”异常解决办法
- Java读取文件中含有中文的解决办法