51 votes

Créer un XmlNode / XmlElement en C # sans XmlDocument?

J'ai une classe simple qui, pour l'essentiel tient juste quelques valeurs. J'ai annulé l' ToString() méthode de retour d'une belle représentation de chaîne.

Maintenant, je veux créer un ToXml() méthode, qui sera de retour à quelque chose comme ceci:

<Song>
    <Artist>Bla</Artist>
    <Title>Foo</Title>
</Song>

Bien sûr, je pourrais simplement utiliser un StringBuilder ici, mais je voudrais revenir un XmlNode ou XmlElement, pour être utilisé avec XmlDocument.AppendChild.

Je ne semble pas être en mesure de créer un XmlElement autres que l'appel d' XmlDocument.CreateElement, donc je me demande si je viens négligé quelque chose, ou si j'ai vraiment soit passer soit une XmlDocument ou ref XmlElement de travailler avec, ou que la fonction renvoie une Chaîne qui contient le XML que je veux?

46voto

mohammedn Points 1821

Je recommanderais d'utiliser XDoc et XElement de System.Xml.Linq au lieu de XmlDocument. Ce serait mieux et vous pourrez utiliser le pouvoir LINQ pour interroger et analyser votre XML:

Avec XElement, votre méthode ToXml () ressemblera à ceci:

 public XElement ToXml()
{
    XElement element = new XElement("Song",
                        new XElement("Artist", "bla"),
                        new XElement("Title", "Foo"));

    return element;
}
 

17voto

Panos Points 11429

À partir du W3C (Document Object Model Core) Niveau 1 spécification (le gras est de moi):

La plupart des Api définies par la présente spécification sont des interfaces plutôt que de classes. Cela signifie qu'une mise en œuvre effective uniquement besoin de l'exposer méthodes avec les noms définis et opération spécifiée, pas vraiment mettre en œuvre des classes qui correspondent directement aux interfaces. Cette permet à l'Api DOM pour être mis en œuvre comme un placage mince sur le dessus de l'héritage applications avec leurs propres données structures, ou sur le dessus de la plus récente applications avec une classe différente les hiérarchies. Cela signifie également que ordinaire de constructeurs (en Java ou C++ sens) ne peut pas être utilisé pour créer des Les objets DOM, depuis le sous-jacent les objets à être construit peut avoir peu de rapport avec les DOM les interfaces. La solution conventionnelle à cette conception orientée objet est pour définir l'usine de méthodes qui créent des instances d'objets qui implémentent les différentes interfaces. Dans les DOM Niveau 1, objets de mise en œuvre de certaines l'interface "X" sont créés par un "createX()" de la méthode sur le Document interface; c'est parce que tous les DOM les objets de vivre dans le contexte d'une Document spécifique.

Autant que je sache, vous ne pouvez pas créer de XmlNode (XmlElement, XmlAttribute, XmlCDataSection, etc) sauf XmlDocument à partir d'un constructeur.

En outre, notez que vous ne pouvez pas utiliser XmlDocument.AppendChild() pour les nœuds qui ne sont pas créées par les méthodes de fabrique de la même document. Dans le cas où vous avez un nœud à partir d'un autre document, vous devez utiliser XmlDocument.ImportNode().

14voto

Vlad N Points 169

Vous pouvez regarder la façon dont vous pouvez utiliser les fonctions intégrées de .NET pour sérialiser et désérialiser un objet en XML, plutôt que de créer un ToXML() méthode sur chaque classe qui est essentiellement juste un Objet de Transfert de Données.

J'ai utilisé ces techniques avec succès sur quelques projets, mais n'ont pas les détails de mise en œuvre pratique dès maintenant. Je vais essayer de mettre à jour ma réponse avec mes propres exemples un peu plus tard.

Voici quelques exemples que Google retourné:

La Sérialisation XML en .NET par Venkat Subramaniam http://www.agiledeveloper.com/articles/XMLSerialization.pdf

Comment Sérialiser et Désérialiser un objet en XML http://www.dotnetfunda.com/articles/article98.aspx

Personnalisez votre .NET de l'objet de la sérialisation XML avec .NET attributs XML http://blogs.microsoft.co.il/blogs/rotemb/archive/2008/07/27/customize-your-net-object-xml-serialization-with-net-xml-attributes.aspx

14voto

Barrakoda Points 175

XmlNodes sont livrés avec une propriété OwnerDocument.

Peut-être que vous pouvez simplement faire:

 //Node is an XmlNode pulled from an XmlDocument
XmlElement e = node.OwnerDocument.CreateElement("MyNewElement");
e.InnerText = "Some value";
node.AppendChild(e);
 

4voto

someone Points 41

Vous pouvez retourner une méthode XmlDocument pour la méthode ToXML dans votre classe. Lorsque vous allez ajouter l'élément avec le document de résultat, utilisez simplement quelque chose comme:

 XmlDocument returnedDocument = Your_Class.ToXML();

XmlDocument finalDocument = new XmlDocument();
XmlElement createdElement = finalDocument.CreateElement("Desired_Element_Name");
createdElement.InnerXML = docResult.InnerXML;
finalDocument.AppendChild(createdElement);
 

Ainsi, la valeur entière de "Desired_Element_Name" sur votre résultat XmlDocument sera l'intégralité du contenu du document retourné.

J'espère que ça aide.

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