/// <summary> /// More http://www.w3.org/TR/REC-xml/#NT-Name. /// </summary> /// <param name="tag">The current tag token.</param> /// <returns>The emitted token.</returns> private XmlToken TagName(XmlTagToken tag) { var c = GetNext(); while (c.IsXmlName()) { StringBuffer.Append(c); c = GetNext(); } tag.Name = FlushBuffer(); if (c == Symbols.EndOfFile) { throw XmlParseError.EOF.At(GetCurrentPosition()); } if (c == Symbols.GreaterThan) { return(tag); } else if (c.IsSpaceCharacter()) { return(AttributeBeforeName(tag)); } else if (c == Symbols.Solidus) { return(TagSelfClosing(tag)); } throw XmlParseError.XmlInvalidName.At(GetCurrentPosition()); }
/// <summary> /// More http://www.w3.org/TR/REC-xml/#NT-Attribute. /// </summary> /// <param name="tag">The current tag token.</param> /// <param name="quote">The quote character.</param> private XmlToken AttributeValue(XmlTagToken tag, Char quote) { var c = GetNext(); while (c != quote) { if (c == Symbols.EndOfFile) { throw XmlParseError.EOF.At(GetCurrentPosition()); } if (c == Symbols.LessThan) { throw XmlParseError.XmlLtInAttributeValue.At(GetCurrentPosition()); } if (c == Symbols.Ampersand) { StringBuffer.Append(CharacterReference()); } else { StringBuffer.Append(c); } c = GetNext(); } tag.SetAttributeValue(FlushBuffer()); return(AttributeAfterValue(tag)); }
/// <summary> /// More http://www.w3.org/TR/REC-xml/#NT-Attribute. /// </summary> /// <param name="tag">The current tag token.</param> private XmlToken AttributeName(XmlTagToken tag) { var c = GetNext(); while (c.IsXmlName()) { StringBuffer.Append(c); c = GetNext(); } var name = FlushBuffer(); if (!String.IsNullOrEmpty(tag.GetAttribute(name))) { throw XmlParseError.XmlUniqueAttribute.At(GetCurrentPosition()); } tag.AddAttribute(name); if (c.IsSpaceCharacter()) { do { c = GetNext(); }while (c.IsSpaceCharacter()); } if (c != Symbols.Equality) { throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition()); } return(AttributeBeforeValue(tag)); }
/// <summary> /// More http://www.w3.org/TR/REC-xml/#NT-Attribute. /// </summary> /// <param name="tag">The current tag token.</param> private XmlToken AttributeBeforeName(XmlTagToken tag) { var c = SkipSpaces(); if (c == Symbols.Solidus) { return(TagSelfClosing(tag)); } else if (c == Symbols.GreaterThan) { return(tag); } if (c == Symbols.EndOfFile) { throw XmlParseError.EOF.At(GetCurrentPosition()); } if (c.IsXmlNameStart()) { StringBuffer.Append(c); return(AttributeName(tag)); } throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition()); }
/// <summary> /// More http://www.w3.org/TR/REC-xml/#NT-Attribute. /// </summary> /// <param name="tag">The current tag token.</param> private XmlToken AttributeBeforeValue(XmlTagToken tag) { var c = SkipSpaces(); if (c != Symbols.DoubleQuote && c != Symbols.SingleQuote) { throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition()); } return(AttributeValue(tag, c)); }
/// <summary> /// More http://www.w3.org/TR/REC-xml/#d0e2480. /// </summary> /// <param name="tag">The current tag token.</param> private XmlToken TagSelfClosing(XmlTagToken tag) { var c = GetNext(); tag.IsSelfClosing = true; if (c == Symbols.GreaterThan) { return(tag); } if (c == Symbols.EndOfFile) { throw XmlParseError.EOF.At(GetCurrentPosition()); } throw XmlParseError.XmlInvalidName.At(GetCurrentPosition()); }
/// <summary> /// More http://www.w3.org/TR/REC-xml/#NT-Attribute. /// </summary> /// <param name="tag">The current tag token.</param> private XmlToken AttributeAfterValue(XmlTagToken tag) { var c = GetNext(); if (c.IsSpaceCharacter()) { return(AttributeBeforeName(tag)); } else if (c == Symbols.Solidus) { return(TagSelfClosing(tag)); } else if (c == Symbols.GreaterThan) { return(tag); } throw XmlParseError.XmlInvalidAttribute.At(GetCurrentPosition()); }