Dan
Dan

Reputation: 1575

Convert XML to Object using reflection

If you like problems to resolve, here a big one :D

First, It isn't about serialization, ok?

Well, my situation... I am writting a function that I will pass as parameter a Xml (XmlDocument) and an object (Object) as reference. It will return to me a object (object that was referenced) filled with the values from the Xml (XmlDocument).

For example:

I have a Xml like:

<user>
  <id>1</id>
  <name>Daniel</name>
</user>

Also I have my function

public Object transformXmlToObject (XmlDocument xml, Object ref)
{
  // Scroll each parameters in Xml and fill the object(ref) using reflection.
  return ref;
}

How will I use it?

I will use like this:

[WebMethod]
public XmlDocument RecebeLoteRPS(XmlDocument xml)
{
  // class user receive the object converted from the function
  User user = new User();
  user = transformXmlToObject(xml, user);

  // object filled 
}

I need help guys, please.

Best regards, Dan

Upvotes: 3

Views: 8798

Answers (5)

adeel41
adeel41

Reputation: 3321

I'll add some type validation in the answer posted by @andyuk. So that for each property, it will lookup the property type and then try to convert the xml value so that no exceptions will be thrown.

But still you need to make sure that xml data should have same type of data which you are inserting as property value. You can do by xsd file for your xml file, or just ignore it if you know about your data and it won't change.

                    var pi = entity.GetType( ).GetProperty( eleProperty.Name.LocalName );
                    if ( pi.PropertyType == typeof( DateTime ) )
                    {
                        DateTime val = DateTime.MinValue;
                        DateTime.TryParse( ele.Value, out val );
                        pi.SetValue( entity, val, null );
                    }
                    else if ( pi.PropertyType == typeof( Int32 ) )
                    {
                        int val = 0;
                        Int32.TryParse( eleProperty.Value, out val );
                        pi.SetValue( entity, val, null );
                    }
                    else if ( pi.PropertyType == typeof( bool ) )
                    {
                        bool val = false;
                        Boolean.TryParse( eleProperty.Value, out val );
                        pi.SetValue( entity, val, null );
                    }
                    else
                    {
                        pi.SetValue( entity, eleProperty.Value, null );
                    }

Upvotes: 0

Stephen Cleary
Stephen Cleary

Reputation: 456587

If User is an already-defined object with properties to be filled in with the XML data, then yes, this is an XML serialization problem.

If you want User to be an object with dynamic structure based at run-time on the XML data, then take a look at ExpandoObject in .NET 4.0. It should be possible to traverse the XML tree and build an equivalent tree of ExpandoObject instances.

Upvotes: 1

drharris
drharris

Reputation: 11214

I agree, this is indeed about Serialization, and should be what you're looking for. However, to pique your interest about querying XML documents the easy way, have a look at LINQ to XML.

Upvotes: 0

andyuk
andyuk

Reputation: 39118

This should do what you want.

using System.Xml;
using System.Reflection;
using System.ComponentModel.DataAnnotations;
using System.Collections;

namespace MyProject.Helpers
{
    public class XMLHelper
    {
        public static void HydrateXMLtoObject(object myObject, XmlNode node)
        {
            if (node == null)
            {
                return;
            }

            PropertyInfo propertyInfo;
            IEnumerator list = node.GetEnumerator();
            XmlNode tempNode;

            while (list.MoveNext())
            {
                tempNode = (XmlNode)list.Current;

                propertyInfo = myObject.GetType().GetProperty(tempNode.Name);

                if (propertyInfo != null) {
                    setProperty(myObject,propertyInfo, tempNode.InnerText);

                }
            }
        }
    }
}

Upvotes: 6

Brad Heller
Brad Heller

Reputation: 1551

Erm, yes, this is exactly about serialization. In fact, this is exactly what XML serialization was written for.

Anyway, if you want to write your own, perhaps you can set properties based on the tags in your XML blob? i.e. if you User object has an Id and a Name property, perhaps you should set them in accordance with the XML blob?

Upvotes: 1

Related Questions