2011-04-27 160 views
0

我一直在尋找到轉換XML文件,我不得不 回到我匿名類型的列表,所以我有這樣出頭:轉換XML標籤匿名類型

<Input name="MyProperty" datatype="string">a</Input> 
<Input name="SecondProperty" datatype="IPAddress">b</Input> 
<Input name="ThirdProperty" datatype="int">c</Input> 

,並希望它轉換成格式如下:?

select new 
     { 
     MyProperty=a, 
     SecondProperty=b, 
     ThridProperty=c, 
     } 

有沒有可能做到這一點的想法是返回的那些輸入列表喂到
另一method.Also什麼錯做事這樣?

感謝任何幫助表示讚賞

回答

0

如果你事先知道屬性的名稱,你可以這樣做:

XElement doc = ... 
var obj = new 
{ 
    MyProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "MyProperty").Value, 
    SecondProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "SecondProperty").Value, 
    ThirdProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "ThirdProperty").Value 
} 

如果知道的名字,你可以」不要使用匿名類型。匿名類型是非常規類型,沒有名稱,它們的成員是靜態聲明的。

+0

我希望能從名稱標籤的xml屬性名稱中生成匿名類型的名稱......可以工作嗎? – TommyTwist 2011-04-27 23:21:46

+0

不,因爲直到運行時纔會知道XML的內容。匿名類型的成員必須在編譯時知道......無論如何,如果你事先不知道他們的名字,你將如何使用匿名類型的屬性?字典可能會更適合您的需求 – 2011-04-27 23:52:13

+0

感謝托馬斯的輸入......但問題是,我想在運行時加載這些輸入的集合,它們因輸入而異。我希望有一個基於父輸入標籤返回匿名類型列表的方式。 – TommyTwist 2011-04-28 00:23:02

0

可能不是你要找的解決方案,但只是想通過它在那裏...

東西我發現有用的,當面對XML是裝飾用Serializable屬性的類...它使序列化和從XML輕而易舉。 http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx您可以進一步處理輸出以獲取所需的XML格式。

編輯來回答你回答你的問題如何改變這可能不感興趣的性質,但這裏是可以做的:

[Serializable] 
public struct SerializableKeyValuePair<TKey, TValue> 
{ 
    public TKey Key { get; set; } 

    public TValue Value { get; set; } 
} 

[Serializable] 
public class Input 
{ 
    public List<SerializableKeyValuePair<string, string>> PropertyBag { get; set; } 
} 

但是,你不會有儘可能多的控制,所有的屬性都需要是一個屬性或以XML表示的元素。

+0

事情是我將有一個可變的輸入列表,所以我希望創建一個動態類型而不是有靜態實體 – TommyTwist 2011-04-27 23:22:51

+0

@TommyTwist只要輸入的結構是相同的,你將能夠序列化整個列表(如清單)。 – Craig 2011-04-27 23:35:18

+0

@TommyTwist這裏是關於這個主題的教程,以防萬一您感興趣。 http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization – Craig 2011-04-27 23:41:47