使用反射将XML转换为Object

时间:2010-07-16 21:15:43

标签: c# xml reflection

如果你想解决问题,这里有一个很大的问题:D

首先,它不是关于序列化,好吗?

好吧,我的情况......我正在编写一个函数,我将作为参数传递给Xml(XmlDocument)和一个对象(Object)作为参考。它会返回一个对象(被引用的对象),它填充了Xml(XmlDocument)中的值。

例如:

我有一个Xml,如:

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

我也有我的功能

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

我将如何使用它?

我将这样使用:

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

我需要帮助的人。

祝你好运, 丹

5 个答案:

答案 0 :(得分:6)

这应该做你想要的。

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

                }
            }
        }
    }
}

答案 1 :(得分:1)

嗯,是的,这正是序列化。实际上,这正是为其编写XML序列化的原因。

无论如何,如果你想自己编写,也许你可以根据XML blob中的标签设置属性?即如果您的User对象具有IdName属性,您可能应该根据XML blob设置它们吗?

答案 2 :(得分:1)

如果User是一个已经定义的对象,其属性要用XML数据填充,那么是的,这是一个XML序列化问题。

如果希望User在XML数据的运行时具有动态结构的对象,请查看.NET 4.0中的ExpandoObject。应该可以遍历XML树并构建ExpandoObject实例的等效树。

答案 3 :(得分:0)

我同意,这确实是关于序列化的,应该是你正在寻找的。但是,为了激发您对查询XML文档的兴趣,请查看LINQ to XML

答案 4 :(得分:0)

我会在@andyuk发布的答案中添加一些类型验证。因此,对于每个属性,它将查找属性类型,然后尝试转换xml值,以便不会抛出任何异常。

但是仍然需要确保xml数据应该具有相同类型的数据,并将其作为属性值插入。你可以通过xsd文件为你的xml文件做,或者如果你知道你的数据就忽略它,它就不会改变。

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