java - 如何编码节点或文档字段?

标签 java jaxb

我正在尝试用这样的字段编码一个类:

@XmlElement
private Document content;

(JAXB 提示它无法编码(marshal)接口(interface),但这不是重点。)

我希望将 content 表示的 DOM 树导入并插入到结果文档中,因此我最终会得到如下结果:

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

这可能吗?如果可能的话,如何实现?

提前致谢!

最佳答案

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

关于java - 如何编码节点或文档字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18906595/

相关文章:

java - 具有相同名称的 Jaxb 对象

java - 在 Android 中使用 java 媒体框架

java - 部署 spring-ws Web 服务时出现 JAXB 异常

java - groovy 属性类的 JAXB 注释

java - 有没有最好的方法来验证 Java 中 XSD 生成的 XML

java - perl Inline::Java 与 JAXB

java - 使用命名空间解码 XML 响应

java - 在实际应用程序中使用模拟对象(未测试)

java - 将正则表达式应用于 str.split 方法时出现异常

java - 元素类型 “struts-config” 的内容必须匹配“(datasource?,form-b​​eans?