Netbeans 7.1.2 で JaxB を使用すると問題が発生します。
JaxB (New JaxB Binding) を使用してスキーマからクラスを自動生成しました。Marshaller を使用して XML 文字列にシリアル化され、XML 文字列から新しいオブジェクト インスタンスに戻るオブジェクトを作成しています。ただし、次の例外が発生します。
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none)
XML 文字列へのマーシャリング/シリアル化は正常に機能します。問題を引き起こしているのは、非整列化/逆シリアル化されているときです。
次のコードを使用してオブジェクトを構築し、それを XML 文字列にマーシャリングしています。
// build the object
ObjectFactory of = new ObjectFactory();
MyQueryComplexType oaaqc = of.createMyQueryComplexType();
oaaqc.setField1("edit");
oaaqc.setField2("net");
oaaqc.setField3("24");
JAXBElement<MyQueryComplexType> createMyQueryComplexType = of.createMyQueryComplexTypeQuery(oaaqc);
// serialise to xml
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);
Marshaller m = context.createMarshaller();
m.marshal(createMyQueryComplexType, writer);
// output string to console
String theXML = writer.toString();
System.out.println(theXML);
これにより、コンソールに次の XML (フォーマット済み) が生成されます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyQueryComplexTypeQuery xmlns="http://www.somewhere.com/some/path">
<Field1>edit</Field1>
<Field2>net</Field2>
<Field3>24</Field3>
</MyQueryComplexTypeQuery>
次に、次のコードを使用して、文字列を新しいインスタンス MyQueryComplexType に逆シリアル化/非整列化します。
Unmarshaller u = context.createUnmarshaller();
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
自動生成された package-info.java には、次の内容が含まれています。
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somewhere.com/some/path", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package MyProject.SomeNamespace.MyQuery;
オブジェクト -> 文字列 -> オブジェクトという単純なプロセスでうまくいくと思いました。JaxB を使用するのはこれが初めてです (優しくしてください)。名前空間について言及している他の投稿を見たことがありますが、すべて問題ないように見えます。スキーマからクラスを自動生成し、オブジェクトを構築し、xml 文字列にマーシャリングしました。非整列化のプロセスを単純に逆にするのも同様だと思いました。
実際の例外は次の行でスローされます。
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
文字列からオブジェクトへのアンマーシャリングは簡単だと思いました。私が何か間違ったことをしているのか、何かが欠けているのかわかりません。皆さんが光を当てるか、目を開けてくれることを願っています。
エラーの原因となっているアプリの内容を簡素化するために、コードを削減しました。名前空間は、Web 上の情報の ID を保護するために変更されました。
何かご意見は?
ありがとう
アンデス