1

次のようなフィールドでクラスをマーシャリングしようとしています:

@XmlElement
private Document content;

(JAXB はインターフェースをマーシャリングできないと文句を言っていますが、それは的外れです。)

で表される DOM ツリーをcontentインポートして結果のドキュメントに挿入したいので、最終的には次のようになります。

<stuff>
    <myObject>
        <content>
            (root node of Document value of content field here)
        </content>
...

これは可能ですか?

前もって感謝します!

4

1 に答える 1

0

フィールド/プロパティ タイプを から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
于 2013-09-20T13:39:12.893 に答える