CDATA not closed when serializing a DocumentFragment
----------------------------------------------------

                 Key: XERCESJ-1216
                 URL: http://issues.apache.org/jira/browse/XERCESJ-1216
             Project: Xerces2-J
          Issue Type: Bug
          Components: Serialization
    Affects Versions: 2.7.1, 2.8.1
            Reporter: Ricardo Amador


org.apache.xml.serialize.XMLSerializer merges a  sequence of CDATA/Text nodes 
started by a CDATA node into a single CDATA, no problem here (although I wasn't 
expecting it). The problem occurs when this sequence is placed in the end of a 
DocumentFragment and you serialize it. The CDATA section is not properly 
closed. For instance the following code writes 'txt.<![CDATA[.cdt..txt..cdt.' 
instead of '.txt.<![CDATA[.cdt..txt..cdt.]]>':

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document d = db.newDocument();
        DocumentFragment df = d.createDocumentFragment();
        df.appendChild(d.createTextNode(".txt."));
        df.appendChild(d.createCDATASection(".cdt."));
        df.appendChild(d.createTextNode(".txt."));
        df.appendChild(d.createCDATASection(".cdt."));
        XMLSerializer ser = new XMLSerializer(System.out, new OutputFormat());
        ser.serialize(df);

It is possible to work around this problem by subclassing XMLSerializer in the 
following manner:

public class XMLSerializer extends org.apache.xml.serialize.XMLSerializer {

        public XMLSerializer() { super(); }
        public XMLSerializer(OutputFormat arg0) { super(arg0); }
        public XMLSerializer(Writer arg0, OutputFormat arg1) { super(arg0, 
arg1); }
        public XMLSerializer(OutputStream arg0, OutputFormat arg1) { 
super(arg0, arg1); }

        public void serialize(DocumentFragment df) throws IOException {
                super.serialize(df);
                ElementState state = getElementState();
                if (state.inCData && !state.doCData) {
                        // CDATA properly closed, but still open in the Printer
                        _printer.printText( "]]>" );
                        state.inCData = false;
                        _printer.flush();
                        if ( _printer.getException() != null )
                                throw _printer.getException();
                }
        }
}


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to