2011-04-27 105 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