2010-07-16 57 views
3

如果您喜歡解決問題,請點擊此處:D使用反射將XML轉換爲對象

首先,這不是關於序列化,好嗎?

好了,我的情況...我書面方式,我將通過爲參數的函數一個xml(XmlDocument的)和對象(對象)作爲參考。它會返回給我一個填充了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 
} 

我需要幫助的人,請。

最好的問候, 丹

+1

聽起來像它是關於序列化到我 - XmlSerializer - 精確。但也許不是。 – 2010-07-16 21:20:39

+4

這是不是序列化? – Firoso 2010-07-16 21:39:09

+0

它的反序列化:) – 2010-07-16 22:52:00

回答

1

呃,是的,這正是有關序列。實際上,這正是爲XML序列化編寫的。

無論如何,如果你想編寫自己的,或許你可以設置基於在XML二進制大對象的標籤屬性?即如果您的User對象具有IdName屬性,那麼您應該按照XML blob來設置它們?

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

       } 
      } 
     } 
    } 
} 
+0

+1其中'setProperty'函數 – 2012-11-20 16:01:15

0

我同意,這確實是關於序列化,應該是你在找什麼。但是,爲了激起您對簡單查詢XML文檔的興趣,請參閱LINQ to XML

1

如果User是具有特性的已經定義的對象與所述XML數據被填充在,那麼,這是一個XML序列化問題。

如果您希望User成爲具有基於XML數據的運行時動態結構的對象,請查看.NET 4.0中的ExpandoObject。應該可以遍歷XML樹並構建一個ExpandoObject實例的等價樹。

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