无URI javax.xml.bind.UnmarshalException:意外元素(uri:“”,local:“SearchAndList”)。预期要素是(无)

时间:2017-01-06 20:28:10

标签: java xml rest jaxb

我无法解组我的数据。我收到以下错误:

  

错误FsceClient - getDataInMatches中的错误:意外元素   (uri:“”,local:“SearchAndList”)。预期要素是(无)   请求参数:+ COUNTRY = US + YR = 2016 + DIV = Ford + WB = 122.0       javax.xml.bind.UnmarshalException:意外元素(uri:“”,local:“SearchAndList”)。预期要素是(无)         at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)

这是我的xml文件:

<SearchAndList>
    <fvd>
        +COUNTRY=US+YR=2016+DIV=Ford+WB=122.0
    </fvd>
    <sol>
    <rsi>
        <sType>Ss</sType>
        <mHave>true</mHave>
        <toAr>0</toAr>
        <toAr>0</toAr>
        <toAr>22</toAr>
    </rsi>
    <rsi>
        <sType>ssa</sType>
        <mHave>true</mHave>
        <toAr>77</toAr>
    </rsi>
    </sol>
    <sol>
        <rsi>
            <sType>sve</sType>
            <mHave>false</mHave>
            <toAr>0</toAr>
            <toAr>21</toAr>
        </rsi>
    </sol>
</SearchAndList>

1 个答案:

答案 0 :(得分:1)

当XSD架构不包含元素定义且仅包含类定义(即复杂类型)时会遇到这种情况。

e.g。对于这个XSD,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="foo">
    <xs:sequence>
      <xs:element name="bar" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

创建的对象工厂是这样的:

@XmlRegistry
public class ObjectFactory {
   public ObjectFactory() {
   }
   public Foo createFoo() {
        return new Foo();
    }
}

但是这个XSD:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="foo" type="foo" nillable="true"/>
  <xs:complexType name="foo">
    <xs:sequence>
      <xs:element name="bar" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

JAXB创建的ObjectFactory类是:

@XmlRegistry
public class ObjectFactory {
    private final static QName _Foo_QNAME = new QName("", "foo");
    public ObjectFactory() {
    }
    public Foo createFoo() {
        return new Foo();
    }
    @XmlElementDecl(namespace = "", name = "foo")
    public JAXBElement<Foo> createFoo(Foo value) {
        return new JAXBElement<Foo>(_Foo_QNAME, Foo.class, null, value);
    }
}

您可以看到还添加了JAXBElement包装器创建方法。使用第二个XSD,unmarshaller在遇到名称为#34; foo&#34;的标记时知道该怎么做。因此,如果你有一个XSD,添加&#34;元素&#34;定义以及复杂类型。

-----编辑---- 示例unmarshaller代码:

JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Object result = ((JAXBElement<Object>) jaxbUnmarshaller.unmarshal(stream)).getValue();
相关问题