web-dev-qa-db-fra.com

Supprimer les espaces et les nouvelles lignes de XML en Java

En utilisant Java, je voudrais prendre un document au format suivant:

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

et le convertir en:

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

J'ai essayé ce qui suit, mais cela ne me donne pas le résultat que j'attendais:

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

Solution de travail en suivant les instructions dans les commentaires de la question par @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

Comme indiqué dans une réponse à une autre question , la fonction appropriée serait DocumentBuilderFactory.setIgnoringElementContentWhitespace () , mais - comme indiqué précédemment - cette fonction nécessite l'utilisation d'un analyseur de validation, qui requiert un XML schéma, ou quelque chose comme ça.

Par conséquent, votre meilleur choix consiste à parcourir le document que vous obtenez de l'analyseur et à supprimer tous les nœuds de type TEXT_NODE (ou ceux TEXT_NODE ne contenant que des espaces).

5
stmoebius

parcourir récursivement le document. supprimez tous les nœuds de texte avec un contenu vide. Coupez tous les nœuds de texte avec un contenu non vide.

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

Le transformateur Java8 + ne crée pas, mais le transformateur Java10 + met partout des lignes vides. Je veux toujours garder de beaux retraits. C’est ma fonction d’aide pour créer une chaîne xml à partir de toute instance DOMElement telle que le noeud racine doc.getDocumentElement().

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