Преобразовать XML в объект, используя отражение - PullRequest
3 голосов
/ 17 июля 2010

Если вы любите решать проблемы, вот большая: 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 
}

Мне нужна помощь, ребята, пожалуйста.

С уважением, Dan

Ответы [ 5 ]

6 голосов
/ 17 июля 2010

Это должно делать то, что вы хотите.

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 голос
/ 17 июля 2010

Если User - это уже определенный объект со свойствами, которые необходимо заполнить данными XML, тогда да, это проблема сериализации XML.

Если вы хотите, чтобы User был объектомс динамической структурой, основанной во время выполнения на данных XML, затем взгляните на ExpandoObject в .NET 4.0.Должна быть возможность обойти дерево XML и построить эквивалентное дерево из ExpandoObject экземпляров.

1 голос
/ 17 июля 2010

Хм, да, это как раз о сериализации.Фактически, это именно то, для чего была написана XML-сериализация.

В любом случае, если вы хотите написать свое собственное, возможно, вы сможете установить свойства на основе тегов в вашем BLOB-объекте XML?т.е. если у вашего объекта User есть свойства Id и Name, возможно, вам следует установить их в соответствии с BLOB-объектом XML?

0 голосов
/ 10 июня 2011

Я добавлю некоторую проверку типов в ответе @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 );
                    }
0 голосов
/ 17 июля 2010

Я согласен, это действительно о сериализации, и это должно быть то, что вы ищете. Однако, чтобы заинтересовать вас простым запросом документов XML, взгляните на LINQ to XML .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...