web-dev-qa-db-fra.com

Java: Convertir un fichier XML formaté en une chaîne de caractères

J'ai un fichier XML formaté, et je veux le convertir en une chaîne de caractères, comment puis-je le faire.

Exemple xml: 

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
       <title>Basic XML</title>
       <price>100</price>
       <qty>5</qty>
   </book>
   <book>
     <title>Basic Java</title>
     <price>200</price>
     <qty>15</qty>
   </book>
</books>

Production attendue

<?xml version="1.0" encoding="UTF-8"?><books><book> <title>Basic XML</title><price>100</price><qty>5</qty></book><book><title>Basic Java</title><price>200</price><qty>15</qty></book></books>

Merci d'avance.

19
Ianthe
//filename is filepath string
BufferedReader br = new BufferedReader(new FileReader(new File(filename)));
String line;
StringBuilder sb = new StringBuilder();

while((line=br.readLine())!= null){
    sb.append(line.trim());
}

utiliser StringBuilder est plus efficace que concat - http://kaioa.com/node/59

42
ant

Exécutez-le via une transformation XSLT identity avec <xsl:output indent="no"> et <xsl:strip-space elements="*"/>

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="no" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Cela supprimera les espaces non significatifs et produira le résultat attendu que vous avez publié.

6
Mads Hansen
// 1. Read xml from file to StringBuilder (StringBuffer)
// 2. call s = stringBuffer.toString()
// 3. remove all "\n" and "\t": 
s.replaceAll("\n",""); 
s.replaceAll("\t","");

édité:

J'ai fait une petite erreur, il est préférable d'utiliser StringBuilder dans votre cas (je suppose que vous n'avez pas besoin de StringBuffer thread-safe)

6
smas

Ouvrez et lisez le fichier.

Reader r = new BufferedReader(filename);
String ret = "";
while((String s = r.nextLine()!=null)) 
{
  ret+=s;
}
return ret;
4
bdares

À l'aide de cette réponse, qui fournit le code permettant à Dom4j de réaliser une jolie impression , changez la ligne qui définit le format de sortie de: createPrettyPrint() à: createCompactFormat()

public String unPrettyPrint(final String xml){  

    if (StringUtils.isBlank(xml)) {
        throw new RuntimeException("xml was null or blank in unPrettyPrint()");
    }

    final StringWriter sw;

    try {
        final OutputFormat format = OutputFormat.createCompactFormat();
        final org.dom4j.Document document = DocumentHelper.parseText(xml);
        sw = new StringWriter();
        final XMLWriter writer = new XMLWriter(sw, format);
        writer.write(document);
    }
    catch (Exception e) {
        throw new RuntimeException("Error un-pretty printing xml:\n" + xml, e);
    }
    return sw.toString();
}
2
Mads Hansen

En Java 1.8 et supérieur

BufferedReader br = new BufferedReader(new FileReader(filePath));
String content = br.lines().collect(Collectors.joining("\n"));
1
vijay yadav

Les solutions ci-dessus fonctionnent si vous compressez tous les espaces dans le document XML. Les autres options rapides sont JDOM (à l'aide de Format.getCompactFormat ()) et dom4j (à l'aide de OutputFormat.createCompactFormat ()) lors de la sortie du document XML. 

Cependant, j'avais l'exigence unique de préserver l'espace blanc contenu dans la valeur textuelle de l'élément et ces solutions ne fonctionnaient pas comme prévu. Tout ce dont j'avais besoin était de supprimer la mise en forme "Impression jolie" ajoutée au document XML.

La solution que j'ai proposée peut être expliquée dans le processus suivant en 3 étapes/regex ... afin de comprendre l'algorithme de la solution.

String regex, updatedXml;

// 1. remove all white space preceding a begin element tag:
regex = "[\\n\\s]+(\\<[^/])";
updatedXml = originalXmlStr.replaceAll( regex, "$1" );

// 2. remove all white space following an end element tag:
regex = "(\\</[a-zA-Z0-9-_\\.:]+\\>)[\\s]+";
updatedXml = updatedXml.replaceAll( regex, "$1" );

// 3. remove all white space following an empty element tag
// (<some-element xmlns:attr1="some-value".... />):
regex = "(/\\>)[\\s]+";
updatedXml = updatedXml.replaceAll( regex, "$1" );

REMARQUE: le pseudo-code est en Java ... le '$ 1' est la chaîne de remplacement qui constitue le 1er groupe de capture.

Cela supprimera simplement l'espace blanc utilisé lors de l'ajout du format "Impression jolie" à un document XML, tout en préservant tous les autres espaces blancs lorsqu'il fait partie de la valeur de texte de l'élément.

1
user1113792

Je suppose que vous voulez lire, ignorer l’espace blanc et le réécrire. La plupart des packages XML ont une option pour ignorer les espaces. Par exemple, DocumentBuilderFactory a setIgnoringElementContentWhitespace à cette fin.

De même, si vous générez le code XML en marshalant un objet, JAXB a JAXB_FORMATTED_OUTPUT

1
Jeff Foster

Underscore-Java library a la méthode statique U.formatXml (xmlstring). Je suis le mainteneur du projet. Exemple live

import com.github.underscore.lodash.U;
import com.github.underscore.lodash.Xml;

public class MyClass {
    public static void main(String[] args) {
        System.out.println(U.formatXml("<a>\n  <b></b>\n  <b></b>\n</a>",
        Xml.XmlStringBuilder.Step.COMPACT));
    }
}

// output: <a><b></b><b></b></a>
0
Valentyn Kolesnikov