当前位置: 首页 > 面试题库 >

如何将JAXB对象编组到org.w3c.dom.Document?

裴俊迈
2023-03-14
问题内容

这给了我一个Document对象,它的顶层节点没有子节点:

public static Document getDocument(Object jaxb)
{
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    //dbf.setNamespaceAware(true);
    Document doc = dbf.newDocumentBuilder().newDocument();

    JAXBContext context = JAXBContext.newInstance(jaxb.getClass());
    context.createMarshaller().marshal(jaxb, doc);

    return doc;
}

这是变通方法,似乎效率更高,因为它先转换为String,然后转换为Document。

public static Document getDocument(Object jaxb)
{                           
    StringWriter writer = new StringWriter();       
    JAXBContext context = JAXBContext.newInstance(jaxb.getClass());
    context.createMarshaller().marshal(jaxb, writer);

    return DocumentBuilderFactory.newInstance().newDocumentBuilder().
parse(new InputSource(new StringReader(writer.toString()));
}

是否有可能完成我要完成的工作?


问题答案:

你在做什么应该工作。这是一个例子:

领域模型(Foo)

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

演示版

import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Create the JAXBContext
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        // Create the Object
        Foo foo = new Foo();
        foo.setBar("Hello World");

        // Create the Document
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.newDocument();

        // Marshal the Object to a Document
        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(foo, document);

        // Output the Document
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(System.out);
        t.transform(source, result);
    }

}

输出量

<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>Hello World</bar></foo>


 类似资料:
  • 在我的项目中,我遇到了一种情况,即封送一个pojo对象,第一次将输出写入XMLfile中,然后在同一个文件中添加具有不同值但相同节点和子节点的相同封送对象。下面是代码- 当Person构造函数中的'id'发生更改,并且下次用不同的属性值封送Person对象时,'file.xml'文件将被覆盖,我丢失了以前的输出。简单地说,我希望每次“id”get发生更改时都追加封送的Person对象。即用不同的值

  • 我试图使用注释将JSON数据转换为XML。我的有点像这样: 我想使用封送来创建看起来如下所示的XML:(请注意标记,它在中没有,但我需要在中添加) 我有以下几门课: 我的main类实际上会读取JSON数据并将其封送为XML。我使用Jackson读取JSON数据,为了简单起见,我删除了这些代码: 以下是我的类: 以下是我创建的类,它作为标记将不会出现在传入的JSON中,但我需要在封送处理期间将其添加

  • 问题内容: 我知道JAXB API的基础知识,但是我坚持尝试做的事情,而且不确定是否确实可行。详细信息如下: 我有一个名为 Book 的类,带有2个类型为String的 公共 实例变量: 我有一个名为 Bookshop 的其他类,带有1个ArrayList类型的 公共 实例变量: 注意:为了节省空间,删除了软件包声明和导入。 这两个类正常工作,我得到的输出XML类似于: 据我所知,实例变量需要声明

  • 问题内容: 如何将对象添加到数组(使用javascript或jquery)?例如,此代码有什么问题? 我想使用此代码在function1数组中保存许多对象,并调用function2在数组中使用该对象。 如何将对象保存在数组中? 如何将对象放入数组并将其保存到变量? 问题答案: 使用Array.push()将任何东西放入数组。 有关数组的更多信息 一次添加多个项目 将项目添加到数组的开头 将一个数组

  • 问题内容: 我想在REST应用程序中接受和响应JSON对象。我需要发送和接收的数据在.properties文件中。我已经阅读了它们,现在位于Object(From )中。是否可以在不实现新类的情况下编组和解组对象? 我在Weblogic服务器中使用Jax-rs API。 问题答案: 对WebLogic不太熟悉,因此我不知道它使用的是哪个版本的Jersey(1.x或2.x),但是使用1.x,您可以简

  • 我有 和Xlink类,该类在内联变量中工作良好。 对于的XML输入 并且子课程拒绝被取消注册(没有任何异常被抛出)。 注:不幸的是,MOXy不是一个选项。 编辑:新编组对象 Edit2:在对测试对象进行了一些解组和编组的实验之后,我发现我需要在内容的标题中定义xmlns名称空间,以便与类似问题在于,我从一个包装类中获取Course元素,该包装类由resteasy解析出来。因此,生成的类不会携带名称