2016-07-06 95 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