【问题标题】:Unable to unmarshal xml-string to java object无法将 xml 字符串解组为 java 对象
【发布时间】:2019-08-06 15:14:41
【问题描述】:

Unmarshal xml-string to java-object 给出以下错误:

javax.xml.bind.UnmarshalException: 意外元素 (uri:"", 本地:“AppServerResponse”)。预期的元素是 http://www.coda.com/efinance/schemas/appserver}AppServerResponse>

这是 AppServerResponse Java 类

@XmlRootElement (name = "AppServerResponse", namespace = "http://www.coda.com/efinance/schemas/appserver")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AppServerResponse", namespace = "http://www.coda.com/efinance/schemas/appserver", propOrder = {
    "getEnvironment",
    "listUserCompanies",
    "softToHardDate"
})
public class AppServerResponse  extends ServiceResponse
{

    @XmlElement(name = "GetEnvironment", namespace = "http://www.coda.com/efinance/schemas/appserver")

    protected GetEnvironmentResponseVerb getEnvironment;
    @XmlElement(name = "ListUserCompanies", namespace = "http://www.coda.com/efinance/schemas/appserver")
    protected ListUserCompaniesResponseVerb listUserCompanies;
    @XmlElement(name = "SoftToHardDate", namespace = "http://www.coda.com/efinance/schemas/appserver")

    protected SoftToHardDateResponseVerb softToHardDate;

解组函数的代码和 xml 消息已解组:

String strResponse = "<AppServerResponse uri=\"http://www.coda.com/efinance/schemas/appserver\" version=\"2.0\" >"
                                + "<GetEnvironment>"
                                    + "<Response status=\"success\">"
                                        + "<Environment>"
                                            + "<CmpCode>TEST</CmpCode>"
                                            + "<CapCode>INTERFACE</CapCode>"
                                            + "<HomeCurr>EUR</HomeCurr>"
                                            + "<DateOrder>1</DateOrder>"
                                            + "<DateDisplay>1</DateDisplay>"
                                            + "<DateSep>/</DateSep>"
                                            + "<HomeCurrDps>2</HomeCurrDps>"
                                            + "<HomeCurrSymbol>€</HomeCurrSymbol>"
                                            + "<HomeCurrSymbolPos>before</HomeCurrSymbolPos>"
                                            + "<HomeCurrLinkType>no_link</HomeCurrLinkType>"
                                            + "<HomeCurrParent>EURO</HomeCurrParent>"
                                            + "<CurrentPeriod>2018/4</CurrentPeriod>"
                                            + "<CmpTimeStamp>11</CmpTimeStamp>"
                                            + "<CapTimeStamp>3</CapTimeStamp>"
                                            + "<UsrTimeStamp>12</UsrTimeStamp>"
                                            + "<ServerVersion>14.000.0014</ServerVersion>"
                                        + "</Environment>"
                                    + "</Response>"
                                + "</GetEnvironment>"
                            + "</AppServerResponse>";
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(false);
            DocumentBuilder db;

            db = dbf.newDocumentBuilder();

            Document docResponse = db.parse(new InputSource(new StringReader(strResponse)));

            writeXmlDocumentToXmlFile(docResponse);

            JAXBContext contextResponse = JAXBContext.newInstance(responseClass);
            Unmarshaller u = contextResponse.createUnmarshaller();

            returnValue = u.unmarshal(docResponse);

【问题讨论】:

    标签: java xsd namespaces


    【解决方案1】:

    您的 JAXB 注释指定您的元素位于 http://www.coda.com/efinance/schemas/appserver 命名空间中,但您的响应字符串中的元素实际上不在命名空间中。看起来您打算通过

    设置默认命名空间
    String strResponse = "<AppServerResponse uri=\"http://www.coda.com/efinance/schemas/appserver\"..."
    

    uri 属性实际上并没有这样做。相反,您需要 xmlns 属性:

    String strResponse = "<AppServerResponse xmlns=\"http://www.coda.com/efinance/schemas/appserver\"..."
    

    注意xmlns 属性名称而不是uri

    【讨论】:

    • 感谢您的回答....我将响应 xml-string 更改如下,但没有帮助:>'''String strResponse = "coda.com/efinance/schemas/appserver\" version=\"2.0\" >"''' 我仍然得到完全相同的异常。 ...意外元素(uri:“”,本地:“AppServerResponse”)。预期元素是 coda.com/efinance/schemas/appserver}AppServerResponse>
    • 请注意,响应来自外部系统,不应在我的代码中更改。我在这里添加只是为了测试
    • 在你的评论中你有xmlns:ns=:ns 不正确,因为它将http://www.coda.com/efinance/schemas/appserver 命名空间与“ns”前缀相关联。您的 AppServerResponse 没有前缀(例如 ),因此仍然不在该命名空间中。相反,您需要拥有xmlns=。如果您不应该更改 strResponse 但可以更改 JAXB 代码,则可以尝试删除 @XmlElement 注释中的所有 namespace = ...
    • 再次感谢您的帮助。我们也尝试过这个选项(xmlns="" ...)。结果完全一样(没有解决问题)。
    • 删除 Java 类中的命名空间也没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2018-01-06
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多