2009-10-13 9 views
8

J'ai travaillé avec un service Web REST basé sur java tiers, qui retourne un tableau de xmlNodes. Le xmlNode [] représente un objet et j'essaye de trouver la meilleure manière de désérialiser le xmlNode [] dans l'objet? est-ce de construire un xmlDocument en premier et le Deserialize?xmlNode aux objets

Merci

Répondre

22

Si vous avez le WCF Rest Starter aperçu Kit installé, il y a une astuce:

  • ouvert Visual Studio
  • sélectionner le contenu de votre noeud XML (le XML qui fait un de vos nœuds) et copier le presse-papiers
  • à partir du menu « Edition » dans Visual studio, choisissez « XML coller en tant que types »

Cela collera votre XML qui est le presse-papiers dans votre projet en tant que classe C# qui est capable de désérialiser ce XML exact. Assez chouette!

Voir ces messages de blog à ce sujet:

Cela devrait vous faire économiser beaucoup de frappe et rendre la vie beaucoup plus facile!

MISE À JOUR:
OK, vous avez déjà vos classes générées à partir du XML vous revenez. Maintenant vous devez convertir un XmlNode à votre classe.

Vous devez faire quelque chose comme ceci:

private static T ConvertNode<T>(XmlNode node) where T: class 
{ 
    MemoryStream stm = new MemoryStream(); 

    StreamWriter stw = new StreamWriter(stm); 
    stw.Write(node.OuterXml); 
    stw.Flush(); 

    stm.Position = 0; 

    XmlSerializer ser = new XmlSerializer(typeof(T)); 
    T result = (ser.Deserialize(stm) as T); 

    return result; 
} 

Vous devez écrire la représentation XML (propriété .OuterXml) du XmlNode à un flux (ici un MemoryStream), puis utilisez le XmlSerializer sérialiser retourner l'objet de ce flux.

Vous pouvez le faire avec la méthode générique et appeler

Customer myCustomer = ConvertNode<Customer>(xmlNode); 

ou vous pouvez même transformer ce code soit dans une méthode d'extension de la classe XmlNode pour que vous puissiez écrire:

Customer myCustomer = xmlNode.ConvertNode<Customer>(); 

Marc

+0

Salut, j'ai déjà les objets de la xsd donc je n'ai vraiment pas besoin de faire cette étape. Je veux apprendre quel est le meilleur moyen de passer de xmlNodes [] (objet sérialisé). – 76mel

-1

La meilleure façon de le faire serait d'utiliser la construction dans la classe System.Xml.Serialization.XmlSerializer dans .NET. Une recherche google sur XmlSerializer fournira une tonne de tutoriels que vous pouvez utiliser pour trouver un tutoriel qui fonctionne pour vous.

+1

Évident et inutile. Bien sûr, j'ai besoin de XMLSerializer, mais j'ai un noeud XML et pas une chaîne ou un flux. Heureusement, une recherche google fournit l'autre réponse utile à cette question – edc65

4

Peut être c'est trop tard pour répondre ici mais ça va aider les autres:

Voici la solution que vous serez en mesure de Deserialize à partir du nœud XML.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 

XmlNode xmlNode = xmlDoc.SelectSingleNode("//SystemInfo"); 

XmlSerializer serial = new XmlSerializer(typeof(SystemInfo)); 

SystemInfo syso =(SystemInfo)serial.Deserialize(new XmlNodeReader(xmlNode)); 

charge d'abord le XML à XmlDocument Object puis trouver le nœud parent vous souhaitez désérialiser comme je veux noeud objet InformationsSystème de tout le document XML.

Une fois que vous trouvez que créer un objet XmlSerializer avec le type de classe spécifique que vous souhaitez.

Maintenant, juste passer le new XmlNodeReader(xmlNode) à la méthode Deserialize, vous obtiendrez les objets dans la population un objet de classe comme je peuplé objet syso avec des valeurs XML. Happy Coding :)

Questions connexes