public Model.FoodClassification Load() { string xmlString; using (StreamReader reader = new StreamReader(new FileStream(_xmlPath, FileMode.Open))) { xmlString = reader.ReadToEnd(); } var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlString); var classification = new Model.FoodClassification(); var classes = _DeserializeFoodClassification(xmlDoc.FirstChild.ChildNodes.Cast <XmlNode>(), null, classification); classification.FoodClasses = classes; return(classification); }
private IDictionary <string, FoodClass> _DeserializeFoodClassification(IEnumerable <XmlNode> nodes, FoodClass parent, Model.FoodClassification classification) { var foodClasses = new Dictionary <string, FoodClass>(); foreach (var node in nodes) { var xmlNode = (XmlNode)node; var className = xmlNode.Attributes["name"].Value; var newFoodClass = new FoodClass(className); if (parent != null) { newFoodClass.Parent = parent; } foodClasses.Add(className, newFoodClass); // storage attribute var storagePeriodAttributes = xmlNode.ChildNodes.Cast <XmlNode>() .Where(n => n.Name == "attribute" && n.Attributes["type"].Value == "storagePeriod"); foreach (var storPeriodAttr in storagePeriodAttributes) { // period var childPeriodNodesEnumerable = storPeriodAttr.ChildNodes.Cast <XmlNode>() .Single(n => n.Name == "period").ChildNodes.Cast <XmlNode>(); // from var fromNode = childPeriodNodesEnumerable .Single(n => n.Name == "from"); var fromQuantityNode = fromNode.ChildNodes.Cast <XmlNode>() .Single(n => n.Name == "quantity"); var fromQuantityValue = fromQuantityNode.LastChild.Value; var fromUnitNode = fromNode.ChildNodes.Cast <XmlNode>() .Single(n => n.Name == "unit"); var fromUnitValue = fromUnitNode.LastChild.Value; //to var toNode = childPeriodNodesEnumerable .Single(n => n.Name == "to"); var toQuantityNode = toNode.ChildNodes.Cast <XmlNode>() .Single(n => n.Name == "quantity"); var toQuantityValue = toQuantityNode.LastChild.Value; var toUnitNode = toNode.ChildNodes.Cast <XmlNode>() .Single(n => n.Name == "unit"); var toUnitValue = toUnitNode.LastChild.Value; // temperature var childTemperatureNodesEnumerable = storPeriodAttr.ChildNodes.Cast <XmlNode>() .Single(n => n.Name == "temperature").ChildNodes.Cast <XmlNode>(); // from var fromTemperatureNode = childTemperatureNodesEnumerable .Single(n => n.Name == "from"); var fromTemperatureValue = fromTemperatureNode.LastChild.Value; //to var toemperatureNode = childTemperatureNodesEnumerable .Single(n => n.Name == "to"); var toTemperatureValue = toemperatureNode.LastChild.Value; var storagePeriodInfo = new StoragePeriodInfo(); storagePeriodInfo.FromTime = UnitQuantityConverter.Convert(fromUnitValue, fromQuantityValue); storagePeriodInfo.ToTime = UnitQuantityConverter.Convert(toUnitValue, toQuantityValue); storagePeriodInfo.FromTemperature = int.Parse(fromTemperatureValue); storagePeriodInfo.ToTemperature = int.Parse(toTemperatureValue); storagePeriodInfo.DerivedFromClass = newFoodClass.Title; newFoodClass.StoragePeriods.Add(storagePeriodInfo); } // storage advise var storageAdviseAttribute = xmlNode.ChildNodes.Cast <XmlNode>() .SingleOrDefault(n => n.Name == "attribute" && n.Attributes["type"].Value == "storageAdvise"); if (storageAdviseAttribute != null) { var advice = storageAdviseAttribute.LastChild.Value; newFoodClass.StorageAdvice = advice; } var childClasses = _DeserializeFoodClassification(xmlNode.ChildNodes.Cast <XmlNode>().Where(n => n.Name == "class"), newFoodClass, classification); newFoodClass.Childs = childClasses; } return(foodClasses); }