1

我目前正在尝试将一些现有的 XML 解组为我手动创建的几个类。问题是,我总是收到一个错误,告诉我,JaxB 需要一个天气元素,但找到了一个天气元素。(?)

javax.xml.bind.UnmarshalException:意外元素(uri:“http://www.aws.com/aws”,本地:“天气”)。预期元素是 <{}api>、<{}location>、<{}weather>

我尝试在元素名称中使用和不使用“aws:”。

这是我的天气课:

@XmlRootElement(name = "aws:weather")
public class WeatherBugWeather
{
    private WeatherBugApi api;
    private List<WeatherBugLocation> locations;
    private String uri;

    @XmlElement(name="aws:api")
    public WeatherBugApi getApi()
    {
        return this.api;
    }

    @XmlElementWrapper(name = "aws:locations")
    @XmlElement(name = "aws:location")
    public List<WeatherBugLocation> getLocations()
    {
        return this.locations;
    }

    public void setApi(WeatherBugApi api)
    {
        this.api = api;
    }

    public void setLocations(List<WeatherBugLocation> locations)
    {
        this.locations = locations;
    }

    @XmlAttribute(name="xmlns:aws")
    public String getUri()
    {
        return this.uri;
    }

    public void setUri(String uri)
    {
        this.uri = uri;
    }
}

这就是我尝试解析的 XML:

<?xml version="1.0" encoding="utf-8"?>
<aws:weather xmlns:aws="http://www.aws.com/aws">
    <aws:api version="2.0" />
    <aws:locations>
        <aws:location cityname="Jena" statename="" countryname="Germany" zipcode="" citycode="59047" citytype="1" />
    </aws:locations>
</aws:weather>

我不太确定我做错了什么。有什么提示吗?我怀疑问题出在 xmlns 定义上,但我不知道该怎么做。(您可以通过查看 uri 属性看到这一点。这是一个不成功的想法。^^)是的,我确实尝试设置命名空间,但设置的是命名空间的 uri 而不是它的...名称。

4

2 回答 2

3

我建议package-info在您的域模型中添加一个带有@XmlSchema注释的类以指定命名空间限定:

包信息

@XmlSchema(
    namespace = "http://www.aws.com/aws",
    elementFormDefault = XmlNsForm.QUALIFIED)
package com.example.foo;

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

笔记

您的XmlRootElementand@XmlElement注释不应包含命名空间前缀。你应该有@XmlRootElement(name = "weather")而不是@XmlRootElement(name = "aws:weather")

了解更多信息

于 2012-07-25T15:13:05.990 回答
2

您的代码中需要命名空间。命名空间前缀没有意义,您需要实际的命名空间(即“http://www.aws.com/aws”)。

@XmlRootElement(name = "weather", namespace="http://www.aws.com/aws")
于 2012-07-25T14:38:10.580 回答