特定の XML を非整列化しようとしています:
<FHcomment>
<TX>rewriting of file</TX>
<tool_id>toolA</tool_id>
<tool_vendor>Company</tool_vendor>
<tool_version>1.7.36.0</tool_version>
</FHcomment>
スキーマはすでに JAXB クラスにコンパイルされています。こちらを参照してください。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"tx",
"toolId",
"toolVendor",
"toolVersion",
"userName",
"commonProperties",
"extensions"
})
@XmlRootElement(name = "FHcomment")
public class FHcomment {
@XmlElement(name = "TX", required = true)
protected TX tx;
@XmlElement(name = "tool_id", required = true)
protected BaseName toolId;
@XmlElement(name = "tool_vendor", required = true)
protected BaseName toolVendor;
@XmlElement(name = "tool_version", required = true)
protected BaseVersion toolVersion;
@XmlElement(name = "user_name")
protected BaseName userName;
@XmlElement(name = "common_properties")
protected CommonPropertiesType commonProperties;
protected ExtensionsType extensions;
@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap<QName, String>();
.....
/*
* GETTERS and SETTERS for the fields have been removed here
*/
.....
}
XML をアンマーシャリングするコードは次のとおりです。
JAXBContext jc = JAXBContext.newInstance(FHcomment.class);
String s = "<FHcomment>....</Fhcomment>";
Unmarshaller unmarshaller = jc.createUnmarshaller();
XMLInputFactory fac = XMLInputFactory.newFactory();
XMLStreamReader xsr = fac.createXMLStreamReader(new StringReader(s));
JAXBElement<FHcomment> foo = unmarshaller.unmarshal(xsr, FHcomment.class);
FHcomment val = foo.getValue();
問題:結果の FHcomment オブジェクトに、FHcomment の子要素が含まれていません。すべてが null であり、これは望ましい結果ではありません。
指定された XML をオブジェクトに完全に非整列化するように JAXB に指示するにはどうすればよいですか?
編集: ValidationHandler を Unmsarshaller に追加した後、問題に近づきました:
予期しない要素 (uri:""、local:"TX")。期待される要素は <{htp://www.example.com/mdf/v4}tool_id>、<{htp://www.example.com/mdf/v4}TX>、<{htp://www.www .example.com/mdf/v4}common_properties>,<{htp://www.example.com/mdf/v4}tool_version>,<{htp://www.example.com/mdf/v4}extensions>, <{htp://www.www.example.com/mdf/v4}tool_vendor>,<{htp://www.www.example.com/mdf/v4}user_name>
予期しない要素 (uri:""、local:"tool_id")。期待される要素は……
提供された XML に名前空間情報が含まれていないという事実を JAXB が気に入らないことがわかりました。
EDIT2:
さらに調査した結果、名前空間の検証なしで JAXB をだまして動作させる方法を見つけることができませんでした。http://cooljavablogs.blogspot.de/2008/08/how-to-instruct-jaxb-to-ignore.htmlのチュートリアルを使用して、問題を回避しました。良い解決策ではありませんが、手元にある最善の方法...