XML Transform Bug Workaround

wersi77

Aktives Mitglied
Hallo zusammen,

leider existiert der folgende XML transform Bug in den Versionen JDK 9 und höher.

Zum Nachstellen des Problems ein beispielhafter Code:
Java:
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class JI9060450 {
    public static void main(String[] args) throws Exception {
        String data = "data";

        StreamSource source = new StreamSource(new StringReader("<foo><bar><![CDATA[" + data + "]]></bar></foo>"));
        StreamResult result = new StreamResult(new StringWriter());

        Transformer tform = TransformerFactory.newInstance().newTransformer();
        tform.setOutputProperty(OutputKeys.INDENT, "yes");
        tform.transform(source, result);

        String xml = result.getWriter().toString(); // This String contains the extra whitespace

        Document document = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder()
            .parse(new InputSource(new StringReader(xml)));

        String resultData = document.getElementsByTagName("bar")
            .item(0)
            .getTextContent();

        assert(data.equals(resultData));
        
        System.out.println(xml);
        
        System.out.println(resultData);
    }
}

Mein Problem ist, dass eine Anwendung mir XML Dateien liefert und ich diese (insbesondere den CDATA) verarbeiten muss. Die plötzlich hinzugefügten Blanks führen dann zum falschen Ergebnis.
Kennt jemand einen funktionierenden Workaround, dass z.B. die XML Dateien entsprechend dem Format aus JDK 8 transformiert bzw. angepasst werden?
Vielen Dank für Eure Hilfe
 

Oneixee5

Top Contributor
Ich bin der Meinung, dein Beispiel provoziert den Bug gar nicht. Es müsste so aussehen:
Java:
final StreamSource source = new StreamSource(new StringReader("<foo>\n\t<bar>\n\t\t<![CDATA[" + data + "]]>\n\t</bar>\n</foo>"));
Das Problem lässt sich leicht umgehen:

Java:
            final String resultData = document.getElementsByTagName("bar")
                .item(0)
                .getTextContent()
                .trim();
Getestet unter:

Bash:
$java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment GraalVM CE 21.0.0 (build 11.0.10+8-jvmci-21.0-b06)
OpenJDK 64-Bit Server VM GraalVM CE 21.0.0 (build 11.0.10+8-jvmci-21.0-b06, mixed mode, sharing)

$uname -srio
Linux 5.8.0-50-generic x86_64 GNU/Linux
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben