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 escaping them?
Below are a couple of options for handling this:
Option #1 - Use 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
.
Option #2 - Interact Directly with the OutputStream
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();
}
}
OutputStreamWriter
than the output factory is configured to. Even defaulting to UTF-8 would be more likely to work than just using the platform default encoding (as you currently do). –
Annoying <?xml version="1.0"?>
at the beginning of the fragment and closes of the original tags at the end(in your example the foo
and bar
elements would be closed after the transformer has run. Try it to see what I mean. –
Anthropophagy 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.
final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);
© 2022 - 2024 — McMap. All rights reserved.