JAXB unmarshall xml没有package-info.java

时间:2014-05-23 11:36:32

标签: java xml jaxb unmarshalling package-info

如果没有package-info.java文件,JAXB unmarshaller会抛出异常。此代码是从另一种语言调用的,自定义类加载器无法正确加载package-info。

我已经手动将namespace参数添加到所有@XmlElement注释中。

Xml根元素具有多个xmlns属性。其中两个(xmlns和xmlns:c)具有相同的值(我无法更改xml,它来自外部服务)

但是:如果我删除xmlns =" urn:foo:bar"即使没有package-info

,也可以从文档中获取

问题:如何在没有package-info的情况下解组(我无法修改无法加载它的自定义类加载器)并且不从xml中删除xmlns? 我应该在代码中更改什么?

Java 1.6_45 vJAXB 2.1.10

XML根元素示例:

<?xml-stylesheet type="text/xsl" href="file1.xslt">
<?xml-stylesheet type="text/xsl" href="file1.xslt"?>
<c:ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="urn:foo:ba" xmlns:c="urn:foo:bar" xmlns:std="urn:foo:std"
 xsi:schemaLocation="urn:foo:bar file2.xsd">

代码:

String path = "D:\\data\\document.xml";

    try {
        JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
        Unmarshaller u = jc.createUnmarshaller();
        Object root = u.unmarshal(new File(path)); //exception w/o package-info.java

        CDocument doc= (CDocument) JAXBIntrospector.getValue(root);
        System.out.println(doc);

package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:foo:bar", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    xmlns={@XmlNs(namespaceURI = "urn:foo:bar", prefix = "")})
package test.model;

    import javax.xml.bind.annotation.XmlNs;

例外:

javax.xml.bind.UnmarshalException: Unable to create an instance of my.package.here.model.ANY

任何想法都会受到高度赞赏,我花了很多时间尝试,但仍然没有。

1 个答案:

答案 0 :(得分:1)

BUT: It works if I remove xmlns="urn:foo:bar" from document even without package-info

这意味着您尚未在需要的任何位置添加namespace参数。

在下面的XML文档中,如果没有@XmlSchema注释来映射命名空间限定,那么namespace类的@XmlRootElement注释需要Foo参数,并且@XmlElement属性上的bar注释。

<foo xmlns="http://www.example.com">
    <bar>Hello World</bar>
</foo>