I have a number of small XML chunks, that should be embedded in one big XML as child elements. Is there any way to write these chunks to XMLStreamWriter
without
Below are a couple of options for handling this:
javax.xml.transform.Transformer
You could use a javax.xml.transform.Transformer
to transform a StreamSource
representing your XML fragment onto your StAXResult
which is wrapping your XMLStreamWriter
.
OuputStream
Alternatively you could do something like the following. You can leverage flush()
to force the XMLStreamWriter
to output its contents. Then you'll note that I do xsw.writeCharacters("")
this forces the start element to end for bar
before writing the nested XML as a String
. The sample code below needs to be flushed out to properly handle encoding issues.
import java.io.*;
import javax.xml.stream.*;
public class Demo {
public static void main(String[] args) throws Exception {
OutputStream stream = System.out;
XMLOutputFactory xof = XMLOutputFactory.newFactory();
XMLStreamWriter xsw = xof.createXMLStreamWriter(stream);
xsw.writeStartDocument();
xsw.writeStartElement("foo");
xsw.writeStartElement("bar");
/* Following line is very important, without it unescaped data
will appear inside the <bar> tag. */
xsw.writeCharacters("");
xsw.flush();
OutputStreamWriter osw = new OutputStreamWriter(stream);
osw.write("<baz>Hello World<baz>");
osw.flush();
xsw.writeEndElement();
xsw.writeEndElement();
xsw.writeEndDocument();
xsw.close();
}
}
final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);
From here
woodstox has a stax implementation and their XMLStreamWriter2 class has a writeRaw() call. We have the same need and this gave us a very nice solution.