4

我应该将简单的 xml 解组为 belo 但得到错误

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.com/service/response/v1", local:"WebResponse"). Expected elements are <{http://example.com/service/request/v1}WebResponse>
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:603)

I tried the solutions in this site but could not solve pls help.

这是 response.xml 文件中的 xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <WebResponse xmlns="http://example.com/service/response/v1">
- <Status>
  <StatusCode>0</StatusCode> 
  <Description>Transaction was successful</Description> 
  </Status>
  </WebResponse>

下面是我的代码:

网络响应类:

用于存储检索到的 xml 的 webresponse 类

import javax.xml.bind.annotation.*;

@XmlRootElement(name="WebResponse")
public class WebResponse {

    private long statusCode;
    private String description;
    @XmlElement(name= "StatusCode")
    public long getStatusCode() {
        return statusCode;
    }
    public void setStatusCode(long statusCode) {
        this.statusCode = statusCode;
    }
    @XmlElement(name= "Description")
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

WebResponseMain 类:

测试员类

import javax.xml.bind.Unmarshaller;
import javax.xml.bind.JAXBContext;

import java.io.FileReader;
import com.example.WebResponse;


public class WebResponseMain {

    public static void main(String[] args) throws Exception{
        JAXBContext context = JAXBContext.newInstance(WebResponse.class);
        Unmarshaller um = context.createUnmarshaller();
        WebResponse WR = (WebResponse) um.unmarshal(new FileReader("c:/tem/Response.XML"));
        System.out.println("StatusCode: " + WR.getStatusCode() + " Description "
                 +WR.getDescription());

    }

}

包信息.java:

@XmlSchema(namespace = "http://example.com/service/request/v1",elementFormDefault=XmlNsForm.QUALIFIED)



package com.example;

import javax.xml.bind.annotation.*;

我使用了本网站中的解决方案,但无法解决请帮忙

4

2 回答 2

4

第1部分

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.com/service/response/v1", local:"WebResponse"). Expected elements are <{http://example.com/service/request/v1}WebResponse>
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:603)

问题在于 XML (response/v1request/v1) 中指定的命名空间。

<WebResponse xmlns="http://example.com/service/response/v1">

并且package-info是不同的

@XmlSchema(namespace = "http://example.com/service/request/v1", elementFormDefault = XmlNsForm.QUALIFIED)
package com.example;

第2部分

您当前的对象模型和映射与 XML 内容不匹配。解决此问题的一种方法是引入Ash 回答Status的类。

地位

import javax.xml.bind.annotation.XmlElement;

public class Status {

    private long statusCode;
    private String description;

    @XmlElement(name = "StatusCode")
    public long getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(long statusCode) {
        this.statusCode = statusCode;
    }

    @XmlElement(name = "Description")
    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

网络响应

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "WebResponse")
public class WebResponse {

    private Status status;

    @XmlElement(name="Status")
    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

}
于 2013-01-25T10:47:49.577 回答
1

尝试添加一个Status类,并将其放在WebResponse字段之间。

我认为,由于您的 XML 元素进入 WebResponse -> Status -> StatusCode/Description,因此您的WebResponse类应该只有一个字段:类型为“状态” Status。然后类Status应该有StatusCodeandDescription字段。

编辑:另外,我认为@XmlElement 注释会出现在字段上,而不是方法上,但是自从我完成它已经有一段时间了......

于 2013-01-25T10:39:02.593 回答