2010-03-05 4 views
1

Je convertis une chaîne XML à Nodelist utilisant le code,Comment supprimer les nouvelles lignes introduites lors de la conversion de Document en String?

InputSource inputSource = new InputSource(new ByteArrayInputStream(
    uploadFormBean.getXhtmlResponse().getBytes())); 
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
Document document; 
document = documentBuilderFactory.newDocumentBuilder().parse(inputSource); 

je fais la inorder ci-dessus pour effectuer une itération sur la liste de noeuds et de remplacer de l'un des éléments de noeud en utilisant le setTextContent.

Je puis convertir le document en chaîne en utilisant l'API ci-dessous,

ByteArrayOutputStream byteOutput = new java.io.ByteArrayOutputStream(); 
Result result = new StreamResult(byteOutput); 
Source source = new DOMSource(document); 
// write the DOM document to the file 
Transformer transformer; 
transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "YES"); 
transformer.transform(source, result); 
String resultText = byteOutput.toString(); 
System.out.println("resultText::" + resultText); 

Quand j'afficher la chaîne, je trouve que le xml résultant a obtenu de nouvelles lignes introduites.

Pourquoi cela se produit-il? La source xml String n'a pas ces nouvelles lignes. Comment cela peut-il être résolu?

Lorsque j'utilise str.replaceAll ("(\ r | \ n)", ""); il supprime toutes les nouvelles lignes. Je ne veux pas que cela arrive. Je veux que la chaîne revienne de la même manière que l'entrée. Je cherche un moyen d'éviter les nouvelles lignes inutiles introduites dans le traitement.

+1

Quelle est la version de Java que vous utilisez? – Max

+0

La réponse à la question suivante semble utile ici: http: // stackoverflow.com/questions/6317273/pourquoi-est-apache-xerces-xalan-ajouter-carriage-returns-to-my-serialized-o – Integrator

Répondre

0

Dans JDK 1.6 Je collé le code ci-dessous et ne pas ajouter de nouvelles lignes

InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("digest.xml"); 
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
Document document = documentBuilderFactory.newDocumentBuilder().parse(resourceAsStream); 
ByteArrayOutputStream byteOutput = new java.io.ByteArrayOutputStream(); 
Result result = new StreamResult(byteOutput); 
Source source = new DOMSource(document); 
// write the DOM document to the file 
Transformer transformer; 
transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "YES"); 
transformer.transform(source, result); 
String resultText = byteOutput.toString(); 
System.out.println("resultText::" + resultText); 

faites-vous quelque chose dans votre setTextContent? peut-être ajouter de nouvelles lignes dans ce code par inadvertance?

+0

Non. Il vient même si après avoir commenté l'élément de noeud remplace la logique. – Rachel

+1

Comme l'a demandé @Max, quelle est votre version JDK? –

+0

J'utilise aussi JDK 1.6. Comme vous le dites quand j'ai essayé un autre échantillon xml il n'introduit pas de nouvelle ligne. Le contenu d'entrée n'est pas un contenu xml mais un contenu xhtml obtenu après la transformation d'un xml en utilisant un xsl. – Rachel

0

Une fois que vous avez un objet DOM, essayez d'obtenir une liste de nœuds en utilisant getChildNodes(). Ensuite, parcourez tous les nœuds enfants en utilisant item() en obtenant le contenu textuel de chaque nœud contenant du contenu textuel, puis en ajoutant ce contenu à votre chaîne. Cela peut fonctionner mieux pour vous que d'essayer de comprendre ce que le transformateur est en train de faire avec votre document.

0

Donc vous voulez que votre sortie XML complète sur 1 ligne?
Si donc ce pourrait à l'astuce:

String separator = System.getProperty("line.separator"); 
System.setProperty("line.separator", ""); 
transformer.transform(source, result); 
// Remember to re-set it to it's original value! 
System.setProperty("line.separator", separator); 
0

je vous offre la classe FilteredWriter:

private class FilteredWriter extends FilterWriter 
{ 
    protected char[] filter = null; 

    protected FilteredWriter(Writer out) { 
     super(out); 
    } 

    public void setFilter(String filteredChars) { 
     filter = filteredChars.toCharArray(); 
    } 

    public void write(String str, int off, int len) throws IOException 
    { 
     write(str.toCharArray(), off, len); 
    } 

    public void write(char[] cbuf, int off, int len) throws IOException 
    { 
     for (int i = off; i < off + len; i++) 
      write(cbuf[i]); 
    } 

    public void write(int c) throws IOException 
    { 
     for (char f : filter) 
     { 
      if (f == (char)c) 
       return; 
     } 
     out.write(c); 
    } 
} 

Et voici comment l'utiliser:

FilteredWriter filteredWriter = new FilteredWriter(writer); 
filteredWriter.setFilter("\r\n\t"); 
StreamResult result = new StreamResult(filteredWriter); 

Hope this helps ...

0

Si vous utilisez l'implémentation de xerces pour votre DOM, alors ser ializing s'assure que l'indicateur d'indentation est défini sur false.

org.apache.xml.serialize.OutputFormat format = 
new org.apache.xml.serialize.OutputFormat(n.getOwnerDocument()); 
format.setIndenting(true); 
format.setPreserveSpace(false); 
format.setLineWidth(80); 
format.setMethod(Method.XML); 

Varun Jangidi

Questions connexes