public void ReadXml(XmlReader reader) { if (Value != null) { try { Value.ReadXml(reader); } catch (Exception e) { var msg = string.Format("Failed to parse Node: {0}", FullName); //m_tree.OnError(msg); LogUtil.ErrorException(e, msg); } } if (Children.Count > 0) { var used = new List <StringNode <V> >(); for (var i = 0; i < Children.Count;) { reader.Read(); if (reader.ReadState == ReadState.EndOfFile) { throw new Exception("Unexpected EOF in Config."); } reader.SkipEmptyNodes(); if (reader.NodeType == XmlNodeType.EndElement) { break; } if (reader.NodeType == XmlNodeType.Element) { var child = GetChild(reader.Name); if (child == null) { OnInvalidNode(reader); } else { i++; used.Add(child); if (!reader.IsEmptyElement) { child.ReadXml(reader); } else { reader.SkipEmptyNodes(); } } } } var unused = Children.Values.Except(used); if (unused.Count() > 0) { m_tree.OnError("Found {0} missing Node(s): {1}", unused.Count(), unused.ToString(", ", node => node.FullName)); } } reader.SkipEmptyNodes(); if (reader.IsEmptyElement) { reader.Read(); } reader.SkipEmptyNodes(); while (reader.NodeType != XmlNodeType.EndElement) { OnInvalidNode(reader); reader.SkipEmptyNodes(); } reader.ReadEndElement(); }
public void ReadXml(XmlReader reader) { if (Value != null) { try { Value.ReadXml(reader); } catch (Exception ex) { LogUtil.ErrorException(ex, string.Format("Failed to parse Node: {0}", FullName)); } } if (Children.Count > 0) { List <StringNode <V> > stringNodeList = new List <StringNode <V> >(); int num = 0; while (num < Children.Count) { reader.Read(); if (reader.ReadState == ReadState.EndOfFile) { throw new Exception("Unexpected EOF in Config."); } reader.SkipEmptyNodes(); if (reader.NodeType != XmlNodeType.EndElement) { if (reader.NodeType == XmlNodeType.Element) { StringNode <V> child = GetChild(reader.Name); if (child == null) { OnInvalidNode(reader); } else { ++num; stringNodeList.Add(child); if (!reader.IsEmptyElement) { child.ReadXml(reader); } else { reader.SkipEmptyNodes(); } } } } else { break; } } IEnumerable <StringNode <V> > stringNodes = Children.Values.Except(stringNodeList); if (stringNodes.Count() > 0) { m_tree.OnError("Found {0} missing Node(s): {1}", (object)stringNodes.Count(), (object)stringNodes.ToString(", ", node => (object)node.FullName)); } } reader.SkipEmptyNodes(); if (reader.IsEmptyElement) { reader.Read(); } reader.SkipEmptyNodes(); while (reader.NodeType != XmlNodeType.EndElement) { OnInvalidNode(reader); reader.SkipEmptyNodes(); } reader.ReadEndElement(); }