/// <summary> /// Tokenizes the XML in a <see cref="XmlReader"/> to a sequence of <see cref="FragmentToken"/>. /// </summary> /// <param name="reader"> /// The reader. /// </param> /// <returns> /// A sequence of <see cref="FragmentToken"/> representing the XML. /// </returns> /// <exception cref="InvalidOperationException"> /// An unknown node type is encountered. /// </exception> public IEnumerable <FragmentToken> Tokenize(XmlReader reader) { var result = new List <FragmentToken>(); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Comment: result.Add(this.CreateCommentToken(reader)); break; case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: case XmlNodeType.Text: case XmlNodeType.EndElement: case XmlNodeType.ProcessingInstruction: case XmlNodeType.XmlDeclaration: result.Add(XmlTokenizer.CreateToken(reader)); break; case XmlNodeType.Element: result.AddRange(this.CreateElementTokens(reader)); break; default: throw new InvalidOperationException($"Unknown XmlNodeType '{reader.NodeType}'"); } } return(result); }
/// <summary> /// Creates a token that describe an attribute from a <see cref="XmlReader"/> is positioned on an attribute /// node. /// </summary> /// <param name="reader"> /// The reader. /// </param> /// <returns> /// The newly created <see cref="FragmentToken"/>. /// </returns> private static FragmentToken CreateAttributeToken(XmlReader reader) { IMarkupExtensionInfo markup; if (XmlTokenizer.MarkupExtensionParser.TryParse(reader.Value, out markup)) { return(new FragmentToken(FragmentType.Attribute, reader.Name, markup)); } return(XmlTokenizer.CreateToken(reader)); }