【问题标题】:JAXB Unmarshalling Error, package-info file for no namespace?JAXB 解组错误,没有命名空间的包信息文件?
【发布时间】:2014-09-05 09:03:16
【问题描述】:

我正在尝试使用 JAXB 从文件中解组 XML。我也有一个网络服务。 我想不使用命名空间,而不是 Web 服务定义的命名空间。

我收到以下错误:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"CustomerName"). Expected elements are <{http://www.ws.NET}CustomerName>

我认为解决方案是将package-info.java 文件更改为不使用命名空间。这是正确的方法吗?我应该对此文件进行哪些更改? package-info.java 文件如下所示:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ws.NET", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package mynewpackage;

感谢您的帮助

【问题讨论】:

  • 本地命名空间是指没有命名空间吗?
  • @BlaiseDoughan,是的,没错,我的意思是没有命名空间。我找到了解决方案 - namespace =""

标签: java xml jaxb unmarshalling


【解决方案1】:

QUALIFIED 更改为 UNQUALIFIED 会有所帮助,如果顶级元素(对应于 @XmlRootElement 注释类)在目标命名空间中,但其子元素不在,例如

<ns:Response xmlns:ns="http://www.ws.NET">
  <CustomerName>Ian</CustomerName>
</ns:Response>

但如果顶级(在本例中为 Response)元素也是不合格的,这将无济于事。

【讨论】:

    【解决方案2】:

    如果您有一个被注释为符合命名空间限定的 JAXB 模型,并且您想要解组不存在的 XML,则有几个选项。

    如果你可以改变模型

    您可能只需要从package-info 类中删除@XmlSchema 注释。如果没有其他包级别的注释,您可以删除整个类。请注意,命名空间信息也可以在其他注解中指定,例如@XmlElement

    如果你不能改变模型

    如果您无法更改 JAXB 模型以删除命名空间限定,那么您可以利用 SAX XMLFilter 在读取 XML 时将命名空间应用到它。

    【讨论】:

    • 我删除了 package-info 类中的 @xmlSchema 注释。 (命名空间=“”)。我不确定这是否是最佳解决方案,但它确实有效。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2014-11-07
    • 1970-01-01
    • 2016-12-18
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多