Quand je construis du XML à partir de zéro avec XmlDocument
, la OuterXml
propriété a déjà tout bien en retrait avec des sauts de ligne. Cependant, si j'appelle LoadXml
un XML très "compressé" (sans saut de ligne ni indentation), la sortie de OuterXml
reste ainsi. Alors ...
Quel est le moyen le plus simple d'obtenir une sortie XML embellie à partir d'une instance de XmlDocument
?
c#
.net
xmldocument
outerxml
Neil C. Obremski
la source
la source
settings.Encoding = Encoding.UTF8;
MemoryStream
+StreamWriter
avec un encodage spécifié au lieu deStringBuilder
, et en obtenant le texte avecenc.GetString(memstream.GetBuffer(), 0, (int)memstream.Length);
. Le résultat final n'est cependant toujours pas formaté. Cela pourrait-il être lié au fait que je commence à partir d'un document lu qui a déjà un formatage? Je veux juste que mes nouveaux nœuds soient également formatés."\r\n"
toEnvironment.Newline
.doc.PreserveWhitespace
ne doit pas être défini sur true. Sinon, il échoue s'il contient déjà une indentation partielle.Comme adapté du blog d' Erika Ehrli , cela devrait le faire:
la source
using
instruction fermera automatiquement l'écrivain lors de l'Dispose()
appel.Ou encore plus facilement si vous avez accès à Linq
la source
<?xml ...?>
et le<!DOCTYPE ...>
du XML. OK pour un fragment, mais pas souhaitable pour un document complet.Une version de méthode d'extension plus courte
la source
Si la méthode Beautify ci-dessus est appelée pour un
XmlDocument
qui contient déjà unXmlProcessingInstruction
nœud enfant, l'exception suivante est levée:Ceci est ma version modifiée de l'original pour se débarrasser de l'exception:
Cela fonctionne pour moi maintenant, vous auriez probablement besoin de scanner tous les nœuds enfants pour le
XmlProcessingInstruction
nœud, pas seulement le premier?Mise à jour avril 2015:
Depuis que j'ai eu un autre cas où le codage était incorrect, j'ai cherché comment appliquer UTF-8 sans BOM. J'ai trouvé ce billet de blog et créé une fonction basée sur celui-ci:
la source
Encoding = Encoding.UTF8
etOmitXmlDeclaration = true
la source
la source
Un moyen simple consiste à utiliser:
Comme cet exemple de code, ce code est ce que j'ai utilisé pour créer une vue arborescente comme une structure à l'aide de XMLWriter:
De cette façon, vous pouvez ajouter des sauts de tabulation ou de ligne comme vous en avez l'habitude, c'est-à-dire \ t ou \ n
la source
Lors de la mise en œuvre des suggestions publiées ici, j'ai eu des problèmes avec l'encodage du texte. Il semble que le codage du
XmlWriterSettings
est ignoré, et toujours remplacé par le codage du flux. Lorsque vous utilisez aStringBuilder
, il s'agit toujours du codage de texte utilisé en interne en C #, à savoir UTF-16.Voici donc une version qui prend également en charge d'autres encodages.
REMARQUE IMPORTANTE: la mise en forme est complètement ignorée si votre
XMLDocument
objet a sapreserveWhitespace
propriété activée lors du chargement du document. Cela m'a laissé perplexe pendant un moment, alors assurez-vous de ne pas l'activer.Mon code final:
Cela enregistrera le xml formaté sur le disque, avec l'encodage de texte donné.
la source
Si vous avez une chaîne de XML, plutôt qu'un document prêt à l'emploi, vous pouvez le faire de cette façon:
la source
Une approche plus simplifiée basée sur la réponse acceptée:
La définition de la nouvelle ligne n'est pas nécessaire. Les caractères de retrait ont également les deux espaces par défaut, j'ai donc préféré ne pas les définir également.
la source