Как создать InputStream из документа или узла - PullRequest
23 голосов
/ 14 мая 2009

Как я могу создать объект InputStream из документа XML или объекта Node для использования в xstream? Мне нужно заменить ??? с некоторым значимым кодом. Спасибо.

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

Ответы [ 5 ]

46 голосов
/ 14 мая 2009
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());
5 голосов
/ 18 августа 2009

Если вы используете 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());
}
2 голосов
/ 07 декабря 2012
 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, вы также можете установить параметр формата в выходном формате.

2 голосов
/ 14 мая 2009

Один из способов сделать это: адаптировать Document к источнику с помощью DOMSource . Создайте StreamResult для адаптации ByteArrayOutputStream . Используйте Transformer из TransformerFactory.newTransformer для копирования данных. Получите ваш byte[] и выполните потоковую передачу с помощью ByteArrayInputStream .

Составление кода оставлено в качестве упражнения.

1 голос
/ 26 августа 2014
public static InputStream documentToPrettyInputStream(Document document) throws IOException{

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    XMLWriter xmlWriter = new XMLWriter(outputStream, OutputFormat.createPrettyPrint());
    xmlWriter.write(document);
    xmlWriter.close();
    InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

    return inputStream;

}

Если вам довелось использовать DOM4j, и вам нужно его красиво распечатать!

...