JAXB 取消编组不起作用。预期元素为(无)

2022-09-02 09:09:24

我正在尝试取消 XML 的封送。

这就是我的XML的样子

<DeviceInventory2Response xmlns="http://tempuri.org/">
<DeviceInventory2Result xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Obj123 xmlns="">
     <Id>1</Id>
     <Name>abc</Name>
  </Obj123>
  <Obj456 xmlns="">
  .
  .
  .

我正在尝试在Obj123下获取Id和Name。但是,当我运行我的unmarshal命令时,我收到以下错误。

An Error:  javax.xml.bind.UnmarshalException: unexpected element (uri:"http://tempuri.org/", local:"DeviceInventory2Response"). Expected elements are (none)

我的代码在主类中如下所示:

Obj123 myObj123 = (Obj123) unmarshaller.unmarshal(inputSource);

我的 Obj123 类如下所示:

package com.myProj.pkg;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


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

  private String Id;
  private String Name;

  public String getId() {
    return Id;
  }

  public String getName() {
    return Name;
  }
}

我认为通过设置我的XMLRootElement,我应该能够跳过XML的前2行,但这似乎并没有发生。有什么想法吗?

编辑:

我的 JAXB 上下文就是这样制作的:

JAXBContext jaxbContext = JAXBContext.newInstance();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Obj123 obj123 = (Obj123) unmarshaller.unmarshal(xmlStreamReader);

答案 1

我通过添加

@XmlRootElement(name="abc_xxx")
其中 abc_XXX 是 XML 的根标记)

eclipse 生成的 JAXB 类没有将此注释添加到我的根类中。


答案 2

JAXB 实现将尝试在文档的根元素(而不是子元素)上进行匹配。如果要取消元化到 XML 文档的中间,则可以使用 StAX 解析文档,将 推进到所需的元素,然后将其取消元化。XMLStreamReader

详细信息

更新

现在我收到以下错误。错误:javax.xml.bind.UnmarshalException - 链接异常:[javax.xml.bind.UnmarshalException:unexpected element (uri:“”, local:“Obj123”).预期元素为(无)]。

A只知道你告诉它的类。而不是:JAXBContext

JAXBContext jaxbContext = JAXBContext.newInstance();

你需要做:

JAXBContext jaxbContext = JAXBContext.newInstance(Obj123.class);

推荐