javax.xml.bind.UnmarshalException:意外元素(uri:“”

问题描述 投票:7回答:5

我在将XML响应从服务转换为POJO时遇到异常。 XML看起来像这样:

这是我的XML response

javax.xml.bind.UnmarshalException: unexpected element (uri:""
, local:"ItemSearchResponse"). Expected elements are
<{http://webservices.amazon.com/AWSECommerceService/2011-08-01}ItemSearchResponse>

我这样使用它:

 Document response = getResponse(url);
 JAXBContext context = JAXBContext.newInstance(AmazonItem.class);
 Unmarshaller unMarshaller = context.createUnmarshaller();
 newItem = (AmazonItem) unMarshaller.unmarshal(response);

以下是我的文件的详细信息

package-info.Java

@XmlSchema(
        namespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01",
        elementFormDefault = XmlNsForm.QUALIFIED)

package com.services.amazon;


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

Amazon item.Java

@XmlRootElement(name="ItemSearchResponse")
@XmlAccessorType(XmlAccessType.FIELD)
public class AmazonItem
{
    @XmlElement(name="Items")
    private Items items = null;
}

items.Java

@XmlAccessorType(XmlAccessType.FIELD)
public class Items { 
    @XmlElement(name="Item")
    List<Item> items = new ArrayList();
}

item.Java

@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
    @XmlElement(name="ASIN")
    private String asin;

    @XmlElement(name="ItemAttributes")
    private ItemAttributes attributes;

    @XmlElement(name="ItemLinks")
    private List<ItemLinks> itemLinks;
}

item attributes.Java

@XmlAccessorType(XmlAccessType.FIELD)
public class ItemAttributes {
    @XmlElement(name="Title")
    private String title;

    @XmlElement(name="Actor")
    private List<String> actor;

    @XmlElement(name="ProductGroup")
    private String productGroup;
}

item link.Java

@XmlAccessorType(XmlAccessType.FIELD)
public class ItemLink {
    @XmlElement(name="Description")
    private String description;

    @XmlElement(name="URL")
    private String url;
}

item links.Java

@XmlAccessorType(XmlAccessType.FIELD)
public class ItemLinks {
    @XmlElement(name="ItemLink")
    List<ItemLink> itemLinks;
}
java xml jaxb unmarshalling
5个回答
6
投票

错误消息表示您正在获取如下所示的XML文档:

<ItemSearchResponse>

而不是像下面那样匹配您已映射的命名空间限定:

<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">

4
投票

解释是here:JAXBContext实例初始化为使用作为参数传递的类(s)和从这些类静态可达的类。

使用包初始化JAXBContext,因此它可以看到在package-info.java中声明的@XmlSchema

JAXBContext.newInstance("com.services.amazon")

2
投票

如果您在getResponse方法中使用DocumentBuilderFactory,请尝试设置命名空间感知:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);

我有相同的UnmarshalException,这解决了它。


1
投票

package-info.java中删除命名空间并进行更改

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED 

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED.

0
投票

从package-info.java中删除命名空间这对我有用

例如:

@javax.xml.bind.annotation.XmlSchema(namespace = "", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
© www.soinside.com 2019 - 2024. All rights reserved.