/// <summary> /// /// </summary> /// <returns></returns> public IEnumerator <IDirective> GetEnumerator() { var dirs = new Directives(); var node = this.node.Value(); if (node.NodeType == XmlNodeType.Element) { var elmnt = node as XElement; dirs.Add(elmnt.Name); foreach (XAttribute attr in elmnt.Attributes()) { dirs.Attr(attr.Name, attr.Value); } } var ctn = node as XContainer; //@TODO: Add failing for null var containsElement = new Contains <XmlNodeType>( new Mapped <XNode, XmlNodeType>( xnode => xnode.NodeType, ctn.Nodes() ), XmlNodeType.Element ).Value(); foreach (XNode child in ctn.Nodes()) { switch (child.NodeType) { case XmlNodeType.Text: if (!containsElement) { dirs.Set((child as XText).Value); } break; case XmlNodeType.CDATA: if (!containsElement) { dirs.Set((child as XCData).Value); } break; case XmlNodeType.Element: dirs.Append(new CopyOfDirective(child)).Up(); break; case XmlNodeType.ProcessingInstruction: dirs.Pi((child as XProcessingInstruction).Target, (child as XProcessingInstruction).Data); break; case XmlNodeType.Attribute: case XmlNodeType.Comment: case XmlNodeType.Document: case XmlNodeType.DocumentFragment: case XmlNodeType.DocumentType: break; default: throw new ArgumentException($"unsupported type {child.NodeType} of node {child.ToString()}"); } } return(dirs.GetEnumerator()); }