2016-07-06 94 views
0

我有一个XML文件,它看起来像这样设置模特属性值

<Root> 
    <Element1>17890</Element> 
    <Element2>0001</Element2> 
    <Element3>123451324A</Element3> 
    <Element4>1</Element4> 
    <Element5>ABC</Element5> 
    <Element6>DEF</Element6> 
    <Element7>99.10</Element7> 
    <Element8>GHI</Element8> 
    <Element9>2014-01-25</Element9> 
    <Element10>JKL</Element10> 
    <Element11>737268</Element11> 
</Root> 

而且我有所有的元素名称作为属性对应的类。比方说,我收集了所有元素,如

IEnumerable<XElement> elements; 

如何将类的属性值设置为xml文件中的元素值?

我想到的唯一的事情是循环遍历元素,使一个大的switch语句部分,如

... 
case "Element3": 
    model.Element3 = element.Value; 
    break; 
... 

有没有更好的解决办法?

+0

你的模型有没有出现在xml中的所有字段? – derloopkat

+0

为什么你不能使用序列化:[XmlSerializer类](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer(v = vs.110).aspx) – Fabio

+0

是的模型所有的字段都出现在xml中。 – Spennet

回答

0

假设你已经拥有你想要从XML拿到领域的类模型:

var elements = XDocument.Load("XMLFile1.xml").Root.Elements(); 
var model = new Model() 
{ 
    Element1 = elements.FirstOrDefault(t => t.Name.LocalName == "Element1"), 
    Element2 = elements.FirstOrDefault(t => t.Name.LocalName == "Element2"), 
}; 

另一种选择是创建一个字典,所以你并不需要更新您的模型每次新的标签名称被添加到xml文件中。

var model = new Dictionary<string, string>(); 
foreach(XElement tag in elements) 
{ 
    model[tag.Name.LocalName] = tag.Value; 
} 

或者使用LINQ

var model = elements.ToDictionary(e => e.Name.LocalName, e => e.Value); 

最后,你可以生成从XML直接动态对象。这里有一个例子:Deserialize XML To Object using Dynamic