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

您可以将字段/属性类型从更改DocumentObject以摆脱与接口相关的异常。当 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 回答