Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write unescaped XML to XMLStreamWriter?

Tags:

java

xml

stax

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?

like image 421
Andrei Petrenko Avatar asked Nov 15 '13 10:11

Andrei Petrenko


3 Answers

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();
    }

}
like image 88
bdoughan Avatar answered Sep 29 '22 10:09

bdoughan


final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);

From here

like image 27
ZiglioUK Avatar answered Sep 29 '22 09:09

ZiglioUK


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.

like image 39
David Thielen Avatar answered Sep 29 '22 08:09

David Thielen