El uso de Java, me gustaría tomar un documento en el siguiente formato:

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

y convertir a:

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

He intentado lo siguiente, pero no me da el resultado que estoy esperando:

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());
Usted podría tratar esto como un archivo de texto, abrir con una clases bufferedreader, leer cada línea y guardar su recorte de valor en el interior de un StringBuilder, después de todo esto, el uso de un BufferedWriter guardar el archivo con el contenido de la StingBuilder.
Si usted está dispuesto a ir a algo así como Xerces-J puede utilizar OutputFormat no bastante imprimir los resultados : xerces.apache.org/xerces-j/apiDocs/org/apache/xml/serialize/…
por cierto, la razón por la setIgnoringElementContentWhitespace no ayuda es porque debe ser el uso de XML Schema/DTD de validación para que el analizador de saber lo que el espacio en blanco es ignorable.
usted nunca debe ser la edición manual de los datos xml como eso. sólo le está pidiendo a meter la pata.
He probado tu solución. Desgraciadamente no funciona bien.

OriginalEl autor Jannis Ioannou | 2012-07-28

5 Comentarios

  1. 16

    La solución de trabajo de acuerdo con las instrucciones de la pregunta de los comentarios de @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);
        }
    }
    Tenga en cuenta que usted debe cerrar las clases bufferedreader después de su uso mediante el uso de finalmente o Java 8 try-con-recursos.

    OriginalEl autor Wolfgang

  2. 5

    de forma recursiva atravesar el documento. quitar cualquiera de los nodos de texto con contenido en blanco. recorte los nodos de texto con los no-vacío de contenido.

    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);
        }
    }
    Esto elimina los espacios en el nodo – el ejemplo no tiene espacios en los nodos de texto
    en realidad, no. los contenidos de “tag2” involucrar a los principales saltos de línea y espacios y final saltos de línea y espacios.
    ¿por qué los downvotes? esto va a hacer exactamente lo que el OP quiere.

    OriginalEl autor jtahlborn

  3. 5

    Tal como se documenta en una respuesta a otra pregunta, la función relevante sería DocumentBuilderFactory.setIgnoringElementContentWhitespace(), pero – como se ha señalado aquí, ya que la función requiere el uso de la validación de un analizador, que requiere de un esquema XML, o alguna de esas.

    Por lo tanto, lo mejor es recorrer el Documento que recibe desde el analizador, y eliminar todos los nodos de tipo TEXT_NODE (o los TEXT_NODEs que contienen sólo espacios en blanco).

    OriginalEl autor stmoebius

  4. 0

    Java8+transformador no crea ningún pero Java10+transformador pone en todas partes de líneas vacías. Yo todavía quiere mantener una bonita sangrías. Este es mi función de ayuda para crear la cadena xml de cualquier DOMElement instancia como doc.getDocumentElement() nodo raíz.

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

    OriginalEl autor Whome

  5. -4

    Prueba este código. read y write métodos en FileStream ignorar los espacios en blanco y las sangrías.

    try {
        File f1 = new File("source.xml");
        File f2 = new File("destination.xml");
        InputStream in = new FileInputStream(f1);  
        OutputStream out = new FileOutputStream(f2);
    
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0){
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
    System.out.println("File copied.");
    } catch(FileNotFoundException ex){
        System.out.println(ex.getMessage() + " in the specified directory.");
        System.exit(0);
    } catch(IOException e7){
        System.out.println(e7.getMessage());  
    }
    que es una fantástica manera de romper el archivo xml…
    Nunca trabaje en archivos XML con puro Arroyos
    WOOOW código de la calidad, como descompilar, el código no tira espacios en blanco en todos los
    Este código no funciona.

    OriginalEl autor afrin216

Dejar respuesta

Please enter your comment!
Please enter your name here