【发布时间】:2013-06-09 07:42:59
【问题描述】:
这给了我一个没有子节点的顶级节点的 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;
}
这是一种变通方法,似乎效率更低,因为它先转换为字符串,然后再转换为文档。
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()));
}
是否有可能完成我想要完成的事情?
【问题讨论】:
-
原来问题不是从 JAXB 编组到文档。问题在于,由于某种原因,与命名空间无关的 XPath 查询不能与第一种方法返回的 Document 对象一起使用,但可以很好地与第二种方法返回的 Document 对象一起使用。解决方案 - 至少目前 - 是重写我的 Xpath 查询。
-
作为迟来的评论:如果您解析编组的数据,与命名空间无关的 XPath 查询之所以起作用,是因为文档构建器默认情况下不支持命名空间。当 JAXB 构建 DOM 时,DocumentBuilder 设置不相关,因为不涉及解析。
标签: java xml dom jaxb marshalling