将xml标记转换为匿名类型

时间:2011-04-27 23:01:09

标签: .net c#-4.0

我正在寻找转换我必须的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,
       }

是否可以这样做?想法是返回这些输入的列表以提供给 另一种方法。这样做的事情有什么不对吗?

感谢任何帮助表示赞赏

2 个答案:

答案 0 :(得分: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
}

如果知道名称,则不能使用匿名类型。匿名类型实际上是没有名称的普通类型,它们的成员是静态声明的。

答案 1 :(得分: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表示的元素。