web-dev-qa-db-fra.com

Comment enregistrer les nouvelles lignes dans l'attribut XML?

Je dois enregistrer le contenu contenant des sauts de ligne dans certains attributs XML, et non du texte . La méthode doit être sélectionnée de manière à pouvoir le décoder dans XSLT 1.0/ESXLT/XSLT 2.0

Quelle est la meilleure méthode d'encodage? 

S'il vous plaît suggérer/donner quelques idées.

55
Tommy

Dans une API DOM conforme, vous n'avez rien à faire. Enregistrez simplement les caractères de nouvelle ligne actuels dans l'attribut, l'API les encodera correctement correctement (voir Spécification XML Canonical, section 5.2 ).

Si vous faites votre propre encodage (c'est-à-dire en remplaçant \n par 
 avant d'enregistrer la valeur d'attribut), l'API encodera votre entrée encore, ce qui donnera 
 dans le fichier XML.

En bout de ligne, la valeur de la chaîne est sauvegardée telle quelle. Vous sortez ce que vous avez mis, pas besoin d'intervenir. 

Cependant… certaines implémentations ne sont pas conformes. Par exemple, ils encoderont les caractères & dans les valeurs d'attributs, mais oublieront les caractères de nouvelle ligne ou les tabulations. Cela vous met dans une position de perdant car vous ne pouvez pas simplement remplacer les nouvelles lignes par 
 à l'avance. 

Ces implémentations sauveront les caractères de nouvelle ligne non codés, comme ceci:

<xml attribute="line 1
line 2" />

Lors de l'analyse d'un tel document, les nouvelles lignes littérales dans les attributs sont normalisées dans un seul espace (là encore, conformément à la spécification) - et sont donc perdues.

Enregistrer (et conserver!) Les nouvelles lignes d'attributs est impossible dans ces implémentations. 

68
Tomalak

Vous pouvez utiliser l'entité &#10; pour représenter une nouvelle ligne dans un attribut XML. &#13; peut être utilisé pour représenter un retour chariot. Un CRLF de style Windows pourrait être représenté par &#13;&#10;.

C'est la syntaxe XML légale. Voir Spéc. XML pour plus de détails.

41
Asaph

Une réponse brute peut être:

XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"Agenda.xml");
//make stuff with the xml
//make attributes value = "\r\n" (you need both expressions to make a new line)
string a = xDoc.InnerXml.Replace("&#xD;", "\r").Replace("&#xA;", "\n").Replace("><",">\r    \n<");
StreamWriter sDoc = new StreamWriter(@"Agenda.xml");
sDoc.Write(a);
sDoc.Flush();
sDoc.Dispose();

Comme vous le voyez, ce sera juste une ficelle

0
rosca dragos