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);
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);
追加して問題を解決しました
@XmlRootElement(name="abc_xxx")
をRootクラスに。
(abc_XXXはXMLのルートタグです)
Eclipseによって生成されたJAXBクラスは、この注釈をルートクラスに追加しませんでした。
代わりに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();
}
これを試してみて、上記の問題を解決してください。私の問題は解決されました。