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

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

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

【问题讨论】:

    标签: java xml xstream


    【解决方案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 调整为SourceDOMSource。创建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,你需要把它打印出来!

          【讨论】:

            猜你喜欢
            • 2011-04-12
            • 2014-07-12
            • 2011-08-08
            • 2012-02-18
            • 1970-01-01
            • 1970-01-01
            • 2020-05-25
            • 2011-10-12
            • 2013-11-30
            相关资源
            最近更新 更多