Convertir XmlDocument en chaîne

218

Voici comment je convertis actuellement XMLDocument en chaîne

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) elle leur échappe.

Par exemple:

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

Ci-dessus est le XML attendu. Mais ça revient

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

Je peux faire String.Replace "\" mais cette méthode est-elle correcte? Est-ce qu'il y a des effets secondaires? Cela fonctionnera-t-il correctement si le XML lui-même contient un "\"

akif
la source

Réponses:

179

Il n'y a pas de citations. C'est juste un débogueur VS. Essayez d'imprimer sur la console ou d'enregistrer dans un fichier et vous verrez. En remarque: jetez toujours les objets jetables:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}
Darin Dimitrov
la source
2
+1 pour fixer le code pour utiliser des usingblocs et non XmlTextWriter.
John Saunders
1
Il convient de noter (comme mentionné dans les remarques ici: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ) que les éléments et les attributs ne seront pas écrits tant que vous n'appelerez pas la méthode Close de XmlWriter.
TonE
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, même si un appel à Closeou simplement la fermeture du xmlTextWriter usingbloc accomplirait la même chose.
Brian
12
Pour rendre le xml joli, passez cet objet settings à XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss
655

En supposant que xmlDoc est un objet XmlDocument qui ne va pas avec xmlDoc.OuterXml?

return xmlDoc.OuterXml;

La propriété OuterXml renvoie une version chaîne du xml.

Chris Moutray
la source
3
Tu as raison. J'ai essayé cela en premier mais quand j'ai vu les guillemets dans le débogueur. Je pensais que c'était à cause d'OuterXml et essayais cette méthode StringWriter. Mais j'avais tort, les citations n'étaient que dans le débogueur. Je vais donc simplement utiliser OuterXml. Merci
Akif
A travaillé pour moi! Faites juste une vérification nulle sur xmlDoc! retourner xmlDoc == null? "xmlDoc est nul": xmlDoc.OuterXml;
SarjanWebDev
1
@SarjanWebDev si vous pensez que votre objet pourrait être nul, alors la vérification nulle va sans dire 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 de sorte que je n'ai pas à gonfler le code avec des vérifications nulles partout ... je suppose que cela dépend juste de votre base de code .. .
Chris Moutray
10
(y) mais OuterXml n'inclut pas de balise déclarative <? xml version = "1.0" encoding = "utf-16"?>
hazjack
3
@hazjack si vous voulez une balise déclarative, utilisez la classe XmlDeclaration msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - si vous voulez ensuite l'écrire dans un fichier, puis utilisez la méthode d'enregistrement trouvée sur vous instance XmlDocument msdn.microsoft.com/en-us/library/dw229a22.aspx - pour moi, la balise déclarative n'a de sens que si vous écrivez pour dire un fichier et non une chaîne C #
Chris Moutray
10

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

Whyser
la source
5

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, utilisez simplement:

yourXmlDoc.AsString()
SixOThree
la source
Cet exemple ne parvient pas à appeler Dispose sur les deux rédacteurs.
Joel Mueller
2

"est affiché comme \"dans le débogueur, mais les données sont correctes dans la chaîne et vous n'avez rien à remplacer. Essayez de vider votre chaîne dans un fichier et vous remarquerez que la chaîne est correcte.

Arsen Mkrtchyan
la source