xmlNode to objects

I have been working with a 3rd party java based REST webservice, that returns an array of xmlNodes.

The xmlNode[] respresent an object and I am trying to work out the best way to Deserialize the xmlNode[] in the object? is it to build up a xmlDocument first and the Deserialize ?

Thanks

13.10.2009 23:15:55
3 ОТВЕТА
РЕШЕНИЕ

If you have the WCF Rest Starter Kit preview installed, there's a neat trick:

  • open Visual Studio
  • select your XML node contents (the XML that makes up one of your nodes) and copy it to the clipboard
  • from your "Edit" menu in Visual Studio, pick "Paste XML as Types"

This will paste your XML that's on the clipboard into your project as a C# class that is capable of deserializing that exact XML. Pretty nifty!

See these blog posts about it:

That should save you a lot of typing and make life a lot easier!

UPDATE:
OK, you already have your classes generated from the XML you get back. Now you need to convert a XmlNode to your class.

You'll have to do something like this:

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

You need to write the XML representation (property .OuterXml) of the XmlNode to a stream (here a MemoryStream) and then use the XmlSerializer to serialize back the object from that stream.

You can do it with the generic method and call

 Customer myCustomer = ConvertNode<Customer>(xmlNode);

or you could even turn that code into either an extension method on the XmlNode class so you could write:

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

Marc

26
14.10.2009 13:08:13
Hi, I already have the objects from the xsd so I really dont nee to do this step. I am wanting to learn whats the best way to go from xmlNodes[] (serialized object).
76mel 14.10.2009 08:06:57

The easiest way to do this would be to use the built in System.Xml.Serialization.XmlSerializer class in .NET. A google search on XmlSerializer will provide a ton of tutorials that you can use to find a tutorial that works for you.

-1
14.10.2009 01:58:12
Obvious and not useful. Of course I need XMLSerializer, but I have an XML node and not a string or a stream. Luckily, a google search provides the other useful answer to this question
edc65 11.02.2016 11:28:28

Maybe this is too late to answer here but it will help others:

Here is the solution you will be able to Deserialize from the XML node.

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

The first load the XML to XmlDocument Object and then find the parent node you will wish to deserialize just like I want SystemInfo object node from all the XML document.

Once you find that create an XmlSerializer object with the specific class type you will wish to.

Now just pass the new XmlNodeReader(xmlNode) to the Deserialize method, you will get the objects populated in the class object just like I populated syso object with XML values.

Happy Coding :)

9
15.10.2018 19:35:47
Don't forget that XmlNodeReader needs disposing. Better to use a using (XmlNodeReader reader = new XmlNodeReader(xmlNode) block.
Ian Goldby 14.06.2018 08:24:59