如何编组节点或文档字段?

时间:2013-09-19 23:30:32

标签: java jaxb

我正在尝试用这样的字段来训练课程:

@XmlElement
private Document content;

(JAXB抱怨它无法编组接口,但这不是重点。)

我希望导出content代表的DOM树并将其插入到结果文档中,所以我最终得到的结果如下:

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

这可能吗?如果可以,怎么做?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以将字段/属性类型从Document更改为Object,以消除与该接口相关的异常。当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;
    }

}

演示代码

<强> input.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