/// <summary> /// Called once an & 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()); }