Question

Je souhaite écrire du texte contenant des caractères d'espacement tels que newline et onglet dans un fichier xml afin que je l'utilise

Element element = xmldoc.createElement("TestElement");
element.appendChild(xmldoc.createCDATASection(somestring));

mais quand je relis ceci en utilisant

Node vs =  xmldoc.getElementsByTagName("TestElement").item(0);
String x = vs.getFirstChild().getNodeValue();

Je reçois une chaîne qui n'a plus de nouvelles lignes.
Quand je regarde directement dans le XML sur le disque, les nouvelles lignes semblent préservées. le problème se produit donc lors de la lecture du fichier XML.

Comment conserver les nouvelles lignes?

Merci!

Était-ce utile?

La solution

Je ne sais pas comment vous analysez et écrivez votre document, mais voici un exemple de code amélioré basé sur le vôtre:

// creating the document in-memory                                                        
Document xmldoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

Element element = xmldoc.createElement("TestElement");                                    
xmldoc.appendChild(element);                                                              
element.appendChild(xmldoc.createCDATASection("first line\nsecond line\n"));              

// serializing the xml to a string                                                        
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();             

DOMImplementationLS impl =                                                                
    (DOMImplementationLS)registry.getDOMImplementation("LS");                             

LSSerializer writer = impl.createLSSerializer();                                          
String str = writer.writeToString(xmldoc);                                                

// printing the xml for verification of whitespace in cdata                               
System.out.println("--- XML ---");                                                        
System.out.println(str);                                                                  

// de-serializing the xml from the string                                                 
final Charset charset = Charset.forName("utf-16");                                        
final ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes(charset));       
Document xmldoc2 = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input);

Node vs =  xmldoc2.getElementsByTagName("TestElement").item(0);                           
final Node child = vs.getFirstChild();                                                    
String x = child.getNodeValue();                                                          

// print the value, yay!                                                                  
System.out.println("--- Node Text ---");                                                  
System.out.println(x);                                                                    

La sérialisation à l'aide de LSSerializer est le moyen utilisé par le W3C ( voir ici ). La sortie est comme prévu, avec des séparateurs de ligne:

--- XML --- 
<?xml version="1.0" encoding="UTF-16"?>
<TestElement><![CDATA[first line
second line ]]></TestElement>
--- Node Text --- 
first line
second line

Autres conseils

Vous devez vérifier le type de chaque noeud à l'aide de node.getNodeType (). Si le type est CDATA_SECTION_NODE, vous devez concaténer les gardes CDATA à node.getNodeValue.

Il n'est pas nécessaire d'utiliser CDATA pour conserver les espaces. La spécification XML spécifie comment coder ces caractères. / p>

Ainsi, par exemple, si vous avez un élément dont la valeur contient un nouvel espace, vous devez le coder avec

.
  &#xA;

Retour chariot:

 &#xD;

Et ainsi de suite

EDIT: couper tous les trucs hors de propos

Je suis curieux de savoir quelle implémentation DOM vous utilisez, car elle ne reflète pas le comportement par défaut de celle de quelques machines virtuelles que j'ai essayées (elles sont livrées avec un impl Xerces). Je suis également intéressé par les caractères de nouvelle ligne de votre document.

Je ne sais pas si CDATA doit préserver les espaces est une donnée. Je soupçonne que de nombreux facteurs sont impliqués. Les DTD / schémas n’affectent-ils pas le traitement des espaces?

Vous pouvez essayer d’utiliser le code XML: space = " preserve " attribut.

xml: space = 'preserve' n'est-ce pas? Cela ne concerne que "tous les espaces". nœuds. Autrement dit, si vous voulez les noeuds d'espaces dans

<this xml:space='preserve'> <has/>
<whitespace/>
</this>

Mais voyez que ces nœuds d’espace sont UNIQUEMENT des espaces.

Je me suis battu pour que Xerces génère des événements permettant également d’isoler le contenu CDATA. Je n'ai pas encore de solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top