如何从 Document 或 Node 创建 InputStream

Posted

技术标签:

【中文标题】如何从 Document 或 Node 创建 InputStream【英文标题】:how to create an InputStream from a Document or Node 【发布时间】:2010-10-26 06:55:07 【问题描述】:

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

Document doc = getDocument();
InputStream is = ???;
MyObject obj = (MyObject) xstream.fromXML(is);

【问题讨论】:

【参考方案1】:
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());

【讨论】:

你在最后一行使用了第一行代码。如果你检查它,中间线没有做任何事情...... 第一行使用 ByteArrayOUTPUTStream,最后一行使用 ByteArrayINPUTStream。此外,第一行中声明的 outputStream 被用作 StreamResult 的参数。 非常感谢!这正是我想要的! 但是 fomsource 不接受文件。将 doc 转换为 Node 也不起作用。有什么建议吗? Document 是 Node 的子接口,所以您应该可以按原样使用 Document。见:docs.oracle.com/javase/7/docs/api/org/w3c/dom/Document.html【参考方案2】:

如果您在没有任何第三方库的情况下使用 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】:

一种方法:将Document 调整为Source 和DOMSource。创建StreamResult 以适应ByteArrayOutputStream。使用TransformerFactory.newTransformer 中的Transformer 复制数据。检索您的byte[] 并使用ByteArrayInputStream 进行流式传输。

将代码放在一起作为练习。

【讨论】:

【参考方案4】:
 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 实现,则此方法有效,您还可以使用输出格式设置格式参数。

【讨论】:

【参考方案5】:
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,你需要把它打印出来!

【讨论】:

以上是关于如何从 Document 或 Node 创建 InputStream的主要内容,如果未能解决你的问题,请参考以下文章

如何从 node.js Express 发送 POST 请求?

[XML-Jsoup]Jsoup_对象的使用(Jsoup工具类,Document,Elements,Element,Node)

如何从节点获取元素

如何在 java 或 node 中为 SAML 创建自己的 IDP

从原型链看DOM--Document类型

node.js 如何从图像创建缩略图?