Comment créer un XmlDocument à l'aide de XmlWriter dans .NET?
Nombreux .NET des fonctions utilisation XmlWriter de sortie/générer le xml. De la sortie à un fichier/cordes/type de mémoire est très fonctionnement:
XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...
Parfois , vous avez besoin de manipuler le Xml résultant et voudrais donc de le charger dans un XmlDocument ou peut-être besoin d'un XmlDocument pour une autre raison, mais vous devez générer le XML à l'aide d'un XmlWriter. Par exemple, si vous appelez une fonction dans une 3e partie de la bibliothèque des sorties à un XmlWriter seulement.
L'une des choses que vous pouvez faire est d'écrire le code xml à une chaîne, puis le charger dans votre XmlDocument:
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
/* write away */
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(S.ToString());
Cependant, c'est inefficace, tout d'abord vous sérialiser tous les xml info en chaîne de caractères, alors vous analyser la chaîne de nouveau pour créer le DOM.
Comment pouvez-vous point un XmlWriter de construire un XmlDocument directement?
- +1 très bonne question, très utile.
Vous devez vous connecter pour publier un commentaire.
Voici au moins une solution:
Apparemment XpathNavigator vous donne un XmlWriter lorsque vous appelez AppendChild()
Les crédits vont à Martin Honnen sur : http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1
XmlWriter
aura un niveau de conformité deDocument
, donc si vous ne l'envoyer comme l'entrée d'une transformation XSL en entrée (et vous n'êtes pas créer un document complet), vous pouvez utilisernew XmlDocument().CreateFragment().CreateNavigator()
à la place.DOCTYPE
. Pas sûr, d'une solution de contournement pour que.async
versions de laXmlWriter
méthodes - il vous suffit de faireSystem.NotImplementedException
: La méthode ou l'opération n'est pas mis en œuvre.XmlDocument
sans passer parString
ouStream
. Un exemple utile: convertir arbitraire WPF d'exécution de l'instance directement dans unXmlDocument
représentation de laXAML
objet graphique, il racines:var xd = new XmlDocument(); var w = xd.CreateNavigator().AppendChild(); XamlWriter.Save(inst, new XamlDesignerSerializationManager(w) { XamlWriterMode = XamlWriterMode.Expression });
(assurez-vous d'utiliser leXamlWriter
deSystem.Windows.Markup
) Cela rend évidemment les alternatives look très maladroit. Fantastique!!!!Vous pourriez faire le contraire : construire le
XmlDocument
d'abord à l'aide de DOM, puis l'écrire sur unXmlWriter
:Many .NET functions use XmlWriter to output/generate xml.
- vous ne pouvez pas utiliser cette approche pour appeler ces fonctions.Vous pouvez écrire le fichier xml à l'aide de classe XMLWriter.
Ici est un exemple pour cela.
L'idée derrière XmlWriter est d'attendre jusqu'à ce que vous avez terminé de modifier vos données avant de vous lancer dans l'écriture.
XmlWriter n'a pas été construit avec votre situation à l'esprit.
Soit
va être avant d'écrire
ou
Il y a un Flux sous-jacent de l'objet que l'XmlWriter a été écrit, si elle est bidirectionnelle (MemoryStream), vous pourriez simplement re-poste à dos -0 - et ensuite utiliser l'objet de Flux de données dans le XmlDocument.Charge(stream).
HTH,
Z