web-dev-qa-db-ja.com

JAXBアンマーシャリングが機能しません。期待される要素は(なし)

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と名前を取得しようとしています。ただし、非整列化コマンドを実行すると、次のエラーが表示されます。

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);
18
Cameron Jones

JAXB実装は、ドキュメントのルート要素(子要素ではなく)で一致を試みます。 XMLドキュメントの途中まで非整列化する場合は、StAXを使用してドキュメントを解析し、XMLStreamReaderを目的の要素に進めてから非整列化できます。

詳細情報

更新

今、私は次のエラーを取得しています。エラー:javax.xml.bind.UnmarshalException-リンク例外あり:[javax.xml.bind.UnmarshalException:予期しない要素(uri: ""、local: "Obj123")。期待される要素は(なし)]です。

JAXBContextは、あなたがそれについて伝えるクラスについてのみ知っています。の代わりに:

JAXBContext jaxbContext = JAXBContext.newInstance();

あなたがする必要があります:

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

追加して問題を解決しました

@XmlRootElement(name="abc_xxx")をRootクラスに。
(abc_XXXはXMLのルートタグです)

Eclipseによって生成されたJAXBクラスは、この注釈をルートクラスに追加しませんでした。

12
Vibha

代わりにObjectFactoryクラスを使用してください

JAXBContext jaxbContext = null;
try {
    jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
} catch (JAXBException e) {
    e.printStackTrace();
}

JAXBElement<ObjectFactory> applicationElement = null;
try {
    applicationElement = (JAXBElement<ObjectFactory>)
    unmarshaller.unmarshal(Thread.currentThread().getClass()
        .getResourceAsStream(fileName));
} catch (JAXBException e) {
    e.printStackTrace();
}

これを試してみて、上記の問題を解決してください。私の問題は解決されました。

8
Sushil