Example #1
0
        /// <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);
        }
Example #2
0
        /// <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));
        }