我正在寻找转换我必须的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,
}
是否可以这样做?想法是返回这些输入的列表以提供给 另一种方法。这样做的事情有什么不对吗?
感谢任何帮助表示赞赏
答案 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表示的元素。