249 votes

Convertir XmlDocument en String

Voici comment je procède actuellement à la conversion Document XML à Chaîne de caractères

StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

Le problème avec cette méthode est que si j'ai " ((guillemets) que j'ai dans les attributs) il leur échappe.

Par exemple :

<Campaign name="ABC">
</Campaign>

Ci-dessus se trouve le XML attendu. Mais il renvoie

<Campaign name=\"ABC\">
</Campaign>

Je peux le faire. String.Replace "\" mais cette méthode est-elle acceptable ? Y a-t-il des effets secondaires ? Cela fonctionnera-t-il correctement si le XML lui-même contient un fichier "\"

717voto

Chris Moutray Points 7936

En supposant que xmlDoc est un objet XmlDocument, quel est le problème avec xmlDoc.OuterXml ?

return xmlDoc.OuterXml;

Le site OuterXml biens renvoie une version en chaîne du xml.

4 votes

Vous avez raison. J'ai d'abord essayé ça mais quand j'ai vu les guillemets dans le débogueur. J'ai pensé que c'était à cause de OuterXml et j'ai essayé la méthode StringWriter. Mais j'avais tort, les guillemets n'étaient présents que dans le débogueur. Donc je vais juste utiliser OuterXml. Merci

0 votes

Ça a marché pour moi ! Il suffit de faire une vérification de nullité sur xmlDoc ! return xmlDoc == null ? "xmlDoc is null" : xmlDoc.OuterXml ;

1 votes

@SarjanWebDev si vous pensez que votre objet peut être nul, alors le null-check va de soi et pour chaque réponse ici ; et vraiment pour chaque interaction avec un objet en C# - personnellement j'essaie de m'assurer que les objets sont toujours construits afin de ne pas avoir à gonfler le code avec des null-checks partout... je suppose que cela dépend de votre base de code...

207voto

Darin Dimitrov Points 528142

Il n'y a pas de guillemets. C'est juste le débogueur VS. Essayez d'imprimer sur la console ou de sauvegarder dans un fichier et vous verrez. En guise d'aparté : toujours disposer des objets jetables :

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}

2 votes

+1 pour corriger le code pour utiliser using et non XmlTextWriter .

1 votes

Worthing notant (comme mentionné dans les remarques ici : msdn.microsoft.com/fr/us/library/system.xml.xmlwriter.aspx ) que les éléments et attributs ne seront pas écrits jusqu'à ce que vous appeliez la méthode Close du XmlWriter.

0 votes

Certains d'entre eux peuvent être écrits immédiatement. Cela dépend de la mise en mémoire tampon. Quoi qu'il en soit, j'ai ajouté un appel à Flush bien qu'un appel à Close ou simplement en fermant le xmlTextWriter using permettrait d'obtenir le même résultat.

12voto

Whyser Points 1298

Si vous utilisez Windows.Data.Xml.Dom.XmlDocument version de XmlDocument (utilisé dans les applications UWP par exemple), vous pouvez utiliser yourXmlDocument.GetXml() pour obtenir le XML sous forme de chaîne.

5voto

SixOThree Points 143

Comme méthode d'extension :

public static class Extensions
{
    public static string AsString(this XmlDocument xmlDoc)
    {
        using (StringWriter sw = new StringWriter())
        {
            using (XmlTextWriter tx = new XmlTextWriter(sw))
            {
                xmlDoc.WriteTo(tx);
                string strXmlText = sw.ToString();
                return strXmlText;
            }
        }
    }
}

Maintenant, à utiliser simplement :

yourXmlDoc.AsString()

0 votes

Cet exemple n'appelle pas Dispose sur les deux écrivains.

2voto

ArsenMkrt Points 24447

" est présenté comme \" dans le débogueur, mais les données sont correctes dans la chaîne, et vous n'avez pas besoin de remplacer quoi que ce soit. Essayez de vider votre chaîne dans un fichier et vous constaterez que la chaîne est correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X