2009-10-13 14 views
8

Pracowałem z usługą WWW REST innej firmy opartą na java, która zwraca tablicę xmlNodes.xmlNode do obiektów

xmlNode [] reprezentuje obiekt i próbuję znaleźć najlepszy sposób na odserializowanie xmlNode [] w obiekcie? jest to najpierw zbudować xmlDocument i Deserialize?

Dzięki

Odpowiedz

22

Jeśli masz zainstalowany zestaw Podgląd WCF Rest Starter, tam miłe trick:

  • otwarty Visual Studio
  • wybrać swoje zawartość węzła XML (XML, który stanowi jeden z węzłów) i skopiować go do schowka
  • z menu „Edycja” w Visual Studio, wybierz „Wklej XML jako typy”

to wkleić swój XML, który znajduje się w schowku w projekcie jako klasa C#, który jest zdolne do deserializacji dokładnie tego XML. Całkiem fajne!

Zobacz te blogu o tym:

To powinno zaoszczędzić dużo pisania i uczynić życie dużo łatwiejsze!

UPDATE:
OK, masz już swoje klasy wygenerowane z XML wrócisz. Teraz musisz przekonwertować klasę na XmlNode.

Musisz zrobić coś takiego:

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; 
} 

Musisz napisać reprezentacji XML (właściwość .OuterXml) z XmlNode do strumienia (tutaj MemoryStream), a następnie użyć XmlSerializer do serializacji cofnij obiekt z tego strumienia.

Można to zrobić za pomocą metody rodzajowe i nazywają

Customer myCustomer = ConvertNode<Customer>(xmlNode); 

lub można nawet włączyć ten kod w obu metodę rozszerzenia na klasy XmlNode więc można napisać:

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

Marc

+0

Witam, już mam obiekty z xsd, więc naprawdę nie muszę robić tego kroku. Chcę dowiedzieć się, jaki jest najlepszy sposób, aby przejść z xmlNodes [] (serialized object). – 76mel

-1

Najprostszym sposobem na to byłoby użyć wbudowanego w klasie System.Xml.Serialization.XmlSerializer w .NET. Wyszukiwarka google na XmlSerializer dostarczy mnóstwo tutoriali, których możesz użyć do znalezienia samouczka, który ci pomoże.

+1

Oczywiste i nieprzydatne. Oczywiście potrzebuję XMLSerializer, ale mam węzeł XML, a nie ciąg lub strumień. Na szczęście wyszukiwarka google zapewnia inną użyteczną odpowiedź na to pytanie. – edc65

4

Być może jest już za późno na odpowiedź, ale pomoże to innym:

Oto rozwiązanie, z którego można uzyskać Deserialize z węzła 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)); 

najpierw załadować XML do XmlDocument Object a następnie znaleźć węzeł nadrzędny będzie chcesz deserializowania tak jak chcę systeminfo węzeł obiektów z całego dokumentu XML.

Po znalezieniu obiektu należy utworzyć obiekt o konkretnym rodzaju klasy, który chcesz.

Teraz wystarczy zdać new XmlNodeReader(xmlNode) do deserializowania metody, dostaniesz obiekty zaludnionych w obiekcie klasy tak jak ja zaludnionych syso obiekt o wartości XML.

Happy Coding :)