フィールド/プロパティ タイプを からDocument
に変更してObject
、そのインターフェイス関連の例外を取り除くことができます。JAXB が構築するオブジェクトのタイプを認識していない場合、JAXB はそれを DOM として扱います。
ドメイン モデル
根
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Root {
private Object content;
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
}
デモコード
入力.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<content>
<dom-1>
<dom-2>
<dom-3/>
</dom-2>
</dom-1>
</content>
</root>
デモ
import java.io.File;
import javax.xml.bind.*;
import org.w3c.dom.Element;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum18906595/input.xml");
Root root = (Root) unmarshaller.unmarshal(xml);
Element element = (Element) root.getContent();
System.out.println(element.getNodeName());
}
}
出力
ここで、ルート要素はプロパティに対応する要素であり、ネストされたドキュメントではありません。
content
アップデート
以下は、探している動作を利用@XmlElementWrapper
して取得する方法です。プロパティをまったく変更することなく、すべての魔法をフィールドに保持していました@XmlAnyElement
。@XmlAccessorType(XmlAccessType.FIELD)
根
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElementWrapper(name="content")
@XmlAnyElement
private List<Object> content;
public Object getContent() {
if(null == content || content.size() == 0) {
return null;
}
return content.get(0);
}
public void setContent(Object content) {
if(null == content) {
this.content = null;
} else {
if(null == this.content) {
this.content = new ArrayList<Object>(1);
}
this.content.set(0, content);
}
}
}
出力
以下は、同じデモ コードを実行した結果の新しい出力です。要素名は、期待どおりのものになりました。
dom-1