Esempio n. 1
0
        /// <summary>
        /// Called once an &amp; character is being seen.
        /// </summary>
        /// <returns>The entity token.</returns>
        String CharacterReference()
        {
            var c       = GetNext();
            var start   = StringBuffer.Length;
            var hex     = false;
            var numeric = c == Symbols.Num;

            if (numeric)
            {
                c   = GetNext();
                hex = c == 'x' || c == 'X';

                if (hex)
                {
                    c = GetNext();

                    while (c.IsHex())
                    {
                        StringBuffer.Append(c);
                        c = GetNext();
                    }
                }
                else
                {
                    while (c.IsDigit())
                    {
                        StringBuffer.Append(c);
                        c = GetNext();
                    }
                }
            }
            else if (c.IsXmlNameStart())
            {
                do
                {
                    StringBuffer.Append(c);
                    c = GetNext();
                }while (c.IsXmlName());
            }

            if (c == Symbols.Semicolon && StringBuffer.Length > start)
            {
                var length  = StringBuffer.Length - start;
                var content = StringBuffer.ToString(start, length);
                StringBuffer.Remove(start, length);

                if (numeric)
                {
                    var number = numeric ? content.FromHex() : content.FromDec();

                    if (!number.IsValidAsCharRef())
                    {
                        throw XmlParseError.CharacterReferenceInvalidNumber.At(_position);
                    }

                    return(number.ConvertFromUtf32());
                }
                else
                {
                    var entity = _resolver.GetSymbol(content);

                    if (String.IsNullOrEmpty(entity))
                    {
                        throw XmlParseError.CharacterReferenceInvalidCode.At(_position);
                    }

                    return(entity);
                }
            }

            throw XmlParseError.CharacterReferenceNotTerminated.At(GetCurrentPosition());
        }