I had XML like this:
<?xml version="1.0" encoding="utf-8"?> <ArrayOfmyNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <myNode> <Name>Echo one</Name> <Category>Reporting</Category> <Id>1</Id> <Workflow> <Application>Reporting</Application> <Name>EchoOne</Name> <Configuration> <ConfigItem> <Key>ReportSuccessToAddress</Key> <Value>echoOneSuccess - at - echoone.com</Value> </ConfigItem> <ConfigItem> <Key>ReportErrorToAddress</Key> <Value>echoOneError - at - echoone.com</Value> </ConfigItem> <ConfigItem> <Key>ReportSuccessCcAddress</Key> <Value>echoOneSuccessCc - at - echoone.com</Value> </ConfigItem> </Configuration> </Workflow> </myNode> <myNode> <Name>Echo two</Name> <Category>Reporting</Category> <Id>2</Id> <Workflow> <Application>Reporting</Application> <Name>EchoTwo</Name> <Configuration> <ConfigItem> <Key>ReportSuccessToAddress</Key> <Value>echoTwoSuccess - at - echoone.com</Value> </ConfigItem> <ConfigItem> <Key>ReportErrorToAddress</Key> <Value>echoTwoError - at - echoone.com</Value> </ConfigItem> <ConfigItem> <Key>ReportSuccessCcAddress</Key> <Value>echoTwoSuccessCc - at - echoone.com</Value> </ConfigItem> </Configuration> </Workflow> </myNode> </ArrayOfmyNode>
Instead of - at - should be @, I am having problems with spambot protection :)
And I wanted to extract all e-mails from ReportSuccessToAddress, ReportErrorToAddress and ReportSuccessCcAddress nodes.
Model I implemented as array in my view:
@model PlayingWithXmlInAspMvc.Models.PlayingWithXmlModel[]
Then I had to load XML from file:
XElement linqMyNodes = XElement.Load(Request.Url.AbsoluteUri + "PlayingWithXml.xml");
If you need to load XML from string, then use parse.
I have selected all myNode nodes in the XML:
IEnumerable<XElement> myLinqNodes = from myNodes in linqMyNodes.Elements("myNode") select myNodes;
After that in controller I have created model like:
PlayingWithXmlModel[] myModel = new PlayingWithXmlModel[myLinqNodes.Count()];
Extract every ConfigItem element for each myNode:
foreach (var myLinqNode in myLinqNodes) { myModel[i] = new PlayingWithXmlModel(); var Configurations = from configuration in myLinqNode.Elements("Workflow").Elements("Configuration").Elements("ConfigItem") select configuration; }
In previous line there is myModel[i] = new PlayingWithXmlModel(), which means that for every item in array you have to create object, in my case model.
Now I need to extract addresses from Configurations:
foreach (var Configuration in Configurations) { if (Configuration.Element("Key") != null) { switch (Configuration.Element("Key").Value) { case "ReportSuccessToAddress": myModel[i].ReportSuccessToAddress = Configuration.Element("Value").Value.Replace(" ", string.Empty); break; case "ReportErrorToAddress": myModel[i].ReportErrorToAddress = Configuration.Element("Value").Value.Replace(" ", string.Empty); break; case "ReportSuccessCcAddress": myModel[i].ReportSuccessCcAddress = Configuration.Element("Value").Value.Replace(" ", string.Empty); break; } } }
Where .Replace(" ", string.Empty) I needed to delete spaces in values.
On the end I will send model to my view like:
return View(myModel);
This article is just to show few examples of LinqToXml and passing model as array to the view. One small example you can see here.