如何在拥有xml命名空间时解组?

时间:2013-08-01 19:48:01

标签: java xml jaxb marshalling xml-namespaces

我正在尝试使用命名空间解组xml以从中创建对象。我得到的例外是该元素不是预期的。这就是我所拥有的。

@XmlRootElement(name="package")
@XmlAccessorType(XmlAccessType.NONE)
public class DenPackage { 
.....

}

xml:

<?xml version="1.0" encoding="ASCII"?>
<pkg:package xmlns:pkg="http://www.leap.com/rest/package">
</pkg:package>

例外:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.leap.com/rest/package", local:"package"). Expected elements are <{}package>

@XmlRootElement(name="package")是否应该改变?或者,如果您比我知道的更多,我们非常感谢您的帮助。感谢

3 个答案:

答案 0 :(得分:2)

用例#1 - 所有元素都符合命名空间

如果文档中的所有(或大多数)元素都要使用相同的命名空间限定,请使用@XmlSchema注释指定命名空间限定。 @XmlSchema是一个包级注释,因此它会出现一个名为package-info的特殊类,看起来像。指定namespaceelementFormDefault=XmlNsForm.QUALIFIED的组合意味着此命名空间将应用于尚未覆盖命名空间的所有元素。

<强> package-info.java

@XmlSchema(
    namespace = "http://www.leap.com/rest/package",
    elementFormDefault = XmlNsForm.QUALIFIED)
package com.leap.rest.pkg;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

用例#2 - 只是根元素符合命名空间

如果只是根元素是名称空间限定的,那么使用@XmlRootElement注释。

@XmlRootElement(name="package", namespace = "http://www.leap.com/rest/package")
@XmlAccessorType(XmlAccessType.NONE)
public class DenPackage { 
.....

}

更多信息

答案 1 :(得分:1)

只需添加命名空间属性:

@XmlRootElement(name="package", namespace = "http://www.leap.com/rest/package")

答案 2 :(得分:1)

您需要在课堂上定义pkg namespace,如下所示:

@XmlRootElement(name="package" namespace = "http://www.leap.com/rest/package")
@XmlAccessorType(XmlAccessType.NONE)
public class DenPackage { 
.....

}

请记住,如果您的xml中有子元素(未在示例中显示)并且它们也属于命名空间,则为它们定义命名空间以及命名空间不会被绑定的字段“继承”类