如何从文档或节点创建一个InputStream

33

我该如何从 XML 文档或节点对象创建一个 InputStream 对象以便在 xstream 中使用?我需要用一些有意义的代码替换掉 ???。谢谢。

Document doc = getDocument();
InputStream is = ???;
MyObject obj = (MyObject) xstream.fromXML(is);
5个回答

60
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Source xmlSource = new DOMSource(doc);
Result outputTarget = new StreamResult(outputStream);
TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget);
InputStream is = new ByteArrayInputStream(outputStream.toByteArray());

你在最后一行使用了第一行的代码,中间的几行没有做任何事情,如果你检查的话... - AbhishekB
3
第一行使用了ByteArrayOutputStream,而最后一行使用了ByteArrayInputStream。此外,第一行声明的outputStream被用作参数传递给StreamResult。 - Gary Kephart
非常感谢!这正是我正在寻找的! - Arvind Sridharan
但是fomsource不接受文档。将doc转换为Node也不起作用。有什么建议吗? - Ronald
Document是Node的子接口,因此您应该能够直接使用Document。请参见:https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Document.html - Gary Kephart

9
如果您在不使用任何第三方库的情况下使用Java,可以使用以下代码创建InputStream
/*
 * Convert a w3c dom node to a InputStream
 */
private InputStream nodeToInputStream(Node node) throws TransformerException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    Result outputTarget = new StreamResult(outputStream);
    Transformer t = TransformerFactory.newInstance().newTransformer();
    t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    t.transform(new DOMSource(node), outputTarget);
    return new ByteArrayInputStream(outputStream.toByteArray());
}

3
 public static InputStream document2InputStream(Document document)    throws IOException {
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
      OutputFormat outputFormat = new OutputFormat(document);
      XMLSerializer serializer = new XMLSerializer(outputStream, outputFormat);
      serializer.serialize(document);
      return new ByteArrayInputStream(outputStream.toByteArray());
 }

如果您正在使用Apache Xerces实现,这将起作用,您还可以使用输出格式设置参数。


3

2
public static InputStream documentToPrettyInputStream(Document doc) throws IOException {

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    XMLWriter xmlWriter = new XMLWriter(outputStream, OutputFormat.createPrettyPrint());
    xmlWriter.write(doc);
    xmlWriter.close();

    InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

    return inputStream;
}      

如果您使用DOM4j并需要将其打印得漂亮一些!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接