【问题标题】:problem unmarshalling xml doc to Java objects (jaxb)将 xml 文档解组为 Java 对象 (jaxb) 的问题
【发布时间】:2010-11-07 16:22:22
【问题描述】:

我使用 xjc 从 XSD 创建 java 对象。

现在我正在尝试将 xml 文档解组为 java 对象,但我得到了:

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"GlobalComponentInformation

这里有吗?

编辑:

我正在传递一个 org.w3c.dom.Document 对象,它从 Web 服务调用(轴 Web 服务)返回...

注意,这里要解析的ws返回的Document对象包含以下根元素:

<GlobalInformationResponseDocument xmlns="" />

@XmlRootElement 类看起来像:

XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "wsExternalResponse"
})
@XmlRootElement(name = "GlobalInformationResponseDocument")
public class GlobalInformationResponseDocument {

    @XmlElement(name = "WS_ExternalResponse", required = true)
    protected WSExternalResponseType wsExternalResponse;

    /**
     * Gets the value of the wsExternalResponse property.
     * 
     * @return
     *     possible object is
     *     {@link WSExternalResponseType }
     *     
     */
    public WSExternalResponseType getWSExternalResponse() {
        return wsExternalResponse;
    }

    /**
     * Sets the value of the wsExternalResponse property.
     * 
     * @param value
     *     allowed object is
     *     {@link WSExternalResponseType }
     *     
     */
    public void setWSExternalResponse(WSExternalResponseType value) {
        this.wsExternalResponse = value;
    }

}

包装信息:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.mycompany.com/GlobalInformationResponseExt", 
        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.company.jaxb.client;

【问题讨论】:

  • 根类上的@XmlRootElement 是什么样的?还有你的包信息类是什么样的(如果你有的话)?另外,您要解组哪种 XML 输入(流、DOM 等)?
  • GlobalComponentInformation 是从哪里来的?它可能会在您解析的 XML 响应中返回?你不是在 XSD 中定义的吗?

标签: xml jaxb xml-namespaces unmarshalling


【解决方案1】:

您从 Web 服务类接收的根元素:

<GlobalInformationResponseDocument xmlns="" />

与基于您的 JAXB 映射的预期根元素不匹配:

<GlobalInformationResponseDocument xmlns="http://www.mycompany.com/GlobalInformationResponseExt" />

package-info 类指定所有元素都应该是命名空间限定的 (javax.xml.bind.annotation.XmlNsForm.QUALIFIED),并且默认命名空间是 “http://www.mycompany.com/GlobalInformationResponseExt”

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.mycompany.com/GlobalInformationResponseExt", 
        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.company.jaxb.client;

您将需要修复 XML 文档,或者更改 JAXB 映射以匹配文档。在这种情况下,通过删除 package-info。

【讨论】:

  • 我确实更改了 xml 文档,然后传递给不接受修改后的对象的 JAXB 编组对象,除非我将文档转换为字符串然后再转换为文档!
  • 你在“更改xml文档”时做了什么?由于将文档转换为字符串并返回文档有效,我假设您的更改没有正确解决命名空间不匹配问题。
猜你喜欢
  • 2021-04-11
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多