it-swarm.com.de

Entfernen Sie Leerzeichen und Zeilenumbrüche aus XML in Java

Mit Java möchte ich ein Dokument im folgenden Format mitnehmen:

<tag1>
 <tag2>
    <![CDATA[  Some data ]]>
 </tag2>
</tag1>

und konvertiere es in:

<tag1><tag2><![CDATA[  Some data ]]></tag2></tag1>

Ich habe folgendes versucht, aber es gibt mir nicht das Ergebnis, das ich erwarte:

DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setIgnoringElementContentWhitespace(true);
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.parse(new FileInputStream("/tmp/test.xml"));

Writer out = new StringWriter();
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "no");
tf.transform(new DOMSource(doc), new StreamResult(out));
System.out.println(out.toString());
12
Jannis Ioannou

Arbeitslösung nach Anweisungen in den Kommentaren der Frage von @Luiggi Mendoza.

public static String trim(String input) {
    BufferedReader reader = new BufferedReader(new StringReader(input));
    StringBuffer result = new StringBuffer();
    try {
        String line;
        while ( (line = reader.readLine() ) != null)
            result.append(line.trim());
        return result.toString();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
16
Wolfgang

Wie in eine Antwort auf eine andere Frage dokumentiert, wäre die relevante Funktion DocumentBuilderFactory.setIgnoringElementContentWhitespace () , aber wie bereits erwähnt, erfordert diese Funktion die Verwendung eines validierenden Parsers. das erfordert ein XML-Schema oder ein solches.

Daher ist es am besten, das vom Parser erhaltene Dokument zu durchlaufen und alle Knoten vom Typ TEXT_NODE (oder die TEXT_NODEs, die nur Leerzeichen enthalten) zu entfernen.

5
stmoebius

rekursiv das Dokument durchlaufen. Entfernen Sie alle Textknoten mit leerem Inhalt. Beschneiden Sie alle Textknoten mit nicht leerem Inhalt.

public static void trimWhitespace(Node node)
{
    NodeList children = node.getChildNodes();
    for(int i = 0; i < children.getLength(); ++i) {
        Node child = children.item(i);
        if(child.getNodeType() == Node.TEXT_NODE) {
            child.setTextContent(child.getTextContent().trim());
        }
        trimWhitespace(child);
    }
}
5
jtahlborn

Der Java8 + -Transformator erstellt keine, aber der Java10 + -Transformator setzt überall leere Zeilen. Ich möchte immer noch schöne Einrückungen behalten. Dies ist meine Hilfsfunktion zum Erstellen von XML-Zeichenfolgen aus einer DOMElement-Instanz, z. B. einem doc.getDocumentElement()-Wurzelknoten.

public static String createXML(Element elem) throws Exception {
        DOMSource source = new DOMSource(elem);
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        //transformer.setOutputProperty("{http://xml.Apache.org/xslt}indent-amount", "2");
        //transformer.setOutputProperty("http://www.Oracle.com/xml/is-standalone", "yes");
        transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
        transformer.setOutputProperty("http://www.Oracle.com/xml/is-standalone", "yes");
        transformer.transform(source, result);

        // Java10-transformer adds unecessary empty lines, remove empty lines
        BufferedReader reader = new BufferedReader(new StringReader(writer.toString()));
        StringBuilder buf = new StringBuilder();
        try {
            final String NL = System.getProperty("line.separator", "\r\n");
            String line;
            while( (line=reader.readLine())!=null ) {
                if (!line.trim().isEmpty()) {
                    buf.append(line); 
                    buf.append(NL);
                }
            }
        } finally {
            reader.close();
        }
        return buf.toString();  //writer.toString();
    }
0
Whome