有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何整理节点或文档字段?

我试图用这样一个领域来马歇尔一个班级:

@XmlElement
private Document content;

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

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

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

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

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    可以将字段/属性类型从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;
        }
    
    }
    

    演示代码

    输入。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