/// <summary> Begins the processing of an xml tag </summary> public virtual void StartTag(XmlTagInfo tag) { XmlLightElement parent = _parserStack.Peek(); XmlLightElement e = new XmlLightElement(parent, tag); if (Root == null && _parserStack.Count == 1) Root = e; if (tag.SelfClosed == false) _parserStack.Push(e); }
/// <summary> Ends the processing of an xml tag </summary> public virtual void EndTag(XmlTagInfo tag) { XmlLightElement e = _parserStack.Pop(); if (e.TagName != tag.FullName) { throw new XmlException(String.Format("Incorrect tag closed '</{0}>', expected '</{1}>'", tag.FullName, e.TagName)); } e.ClosingTagWhitespace = tag.EndingWhitespace; }
/// <summary> Begins the processing of an xml tag </summary> public virtual void StartTag(XmlTagInfo tag) { XmlLightElement parent = _parserStack.Peek(); XmlLightElement e = new XmlLightElement(parent, tag); if (Root == null && _parserStack.Count == 1) { Root = e; } if (tag.SelfClosed == false) { _parserStack.Push(e); } }
/// <summary> </summary> public override void EndTag(XmlTagInfo tag) { if (_nonClosedTags.Contains(tag.FullName)) { return; } XmlLightElement closed = null; try { XmlLightElement[] stack = _parserStack.ToArray(); if (stack[0].TagName == tag.FullName) { closed = _parserStack.Pop(); return; } //closes any tags left open in these elements bool found = false; for (int i = 0; !found && i < stack.Length; i++) { found = found || StringComparer.OrdinalIgnoreCase.Equals(stack[i].TagName, tag.FullName); } while (found && StringComparer.OrdinalIgnoreCase.Equals((closed = _parserStack.Pop()).TagName, tag.FullName) == false) { } } finally { if (closed != null && StringComparer.OrdinalIgnoreCase.Equals(closed.TagName, tag.FullName)) { closed.ClosingTagWhitespace = tag.EndingWhitespace; } } }
/// <summary> </summary> public override void StartTag(XmlTagInfo tag) { if (_nonClosedTags.Contains(tag.FullName)) { tag.SelfClosed = true; } XmlLightElement parent = _parserStack.Peek(); List <string> allowedParents; if (_nonNestingTags.Contains(tag.FullName) && StringComparer.OrdinalIgnoreCase.Equals(parent.TagName, tag.FullName)) { _parserStack.Pop(); } else if (_htmlHeirarchy.TryGetValue(tag.FullName, out allowedParents)) { int depth = 0; XmlLightElement[] stack = _parserStack.ToArray(); while (depth < stack.Length && allowedParents.BinarySearch(stack[depth].TagName, StringComparer.OrdinalIgnoreCase) < 0) { depth++; } if (depth < stack.Length) { for (; depth > 0; depth--) { _parserStack.Pop(); } } else { StartTag(new XmlTagInfo(allowedParents[0], false)); } } base.StartTag(tag); }
internal XmlLightElement(XmlLightElement parent, XmlTagInfo tag) : this(parent, tag.SelfClosed, tag.FullName, tag.EndingWhitespace, tag.UnparsedTag, tag.Attributes) { }
/// <summary> Ends the processing of an xml tag </summary> public virtual void EndTag(XmlTagInfo tag) { XmlLightElement e = _parserStack.Pop(); if (e.TagName != tag.FullName) throw new XmlException(String.Format("Incorrect tag closed '</{0}>', expected '</{1}>'", tag.FullName, e.TagName)); e.ClosingTagWhitespace = tag.EndingWhitespace; }
public void StartTag(XmlTagInfo tag) { }
public void EndTag(XmlTagInfo tag) { }