private XmlScriptDocument ParseDocument(ScriptParser Parser) { List <XmlScriptProcessingInstruction> ProcessingInstructions = null; int Start = Parser.Start; int Pos; char ch; while (Parser.PeekNextChar() == '?') { Parser.NextChar(); Pos = Parser.Position; while ((ch = Parser.NextChar()) != '?' && ch != 0) { ; } if (ch == 0) { return(null); } if (ProcessingInstructions is null) { ProcessingInstructions = new List <XmlScriptProcessingInstruction>(); } string Text = Parser.Expression.Script.Substring(Pos, Parser.Position - Pos - 1); if (Parser.NextChar() != '>') { throw Parser.SyntaxError("> expected."); } ProcessingInstructions.Add(new XmlScriptProcessingInstruction(Text, Start, Parser.Position - Start, Parser.Expression)); Parser.SkipWhiteSpace(); if (Parser.NextChar() != '<') { return(null); } Start = Parser.Position; } Parser.UndoChar(); XmlScriptElement Root = this.ParseElement(Parser); if (Root is null) { return(null); } return(new XmlScriptDocument(Root, ProcessingInstructions?.ToArray() ?? new XmlScriptProcessingInstruction[0], Start, Parser.Position - Start, Parser.Expression)); }
private void ParseCurrentNode() { switch (_xmlReader.NodeType) { case XmlNodeType.ProcessingInstruction: if (!ProcessingInstructions.ContainsKey(_xmlReader.LocalName)) { ProcessingInstructions[_xmlReader.LocalName] = new List <string>(); } ProcessingInstructions[_xmlReader.LocalName].Add(_xmlReader.Value); break; case XmlNodeType.Element: _level++; if (_rootPathChunks.Count > 0) { var topChunk = _rootPathChunks.Peek(); if (topChunk == "*" || (topChunk == _xmlReader.LocalName && _matchedPathChunks.Count == _level - 1)) { var chunks = _rootPathChunks.Dequeue(); _matchedPathChunks.Push(chunks); } break; } if (_states.Peek().Type == StateType.Property) { if (Utils.Pluralize(_xmlReader.LocalName) == _states.Peek().Name) { _states.Peek().Type = StateType.Array; _tokens.Enqueue(Token.GetStartArray()); } else { _states.Peek().Type = StateType.Object; _tokens.Enqueue(Token.GetStartObject()); } } if (_states.Peek().Type != StateType.Array) { _tokens.Enqueue(Token.GetPropertyName(_xmlReader.LocalName)); } _states.Push(State.Property(_xmlReader.LocalName)); var hasAttrs = _xmlReader.MoveToFirstAttribute(); if (hasAttrs) { _states.Peek().Type = StateType.Object; _tokens.Enqueue(Token.GetStartObject()); } while (hasAttrs) { _tokens.Enqueue(Token.GetAttrName(_xmlReader.LocalName)); _xmlReader.ReadAttributeValue(); _tokens.Enqueue(Token.GetValue(_xmlReader.Value)); hasAttrs = _xmlReader.MoveToNextAttribute(); } _xmlReader.MoveToElement(); if (_xmlReader.IsEmptyElement) { _tokens.Enqueue(_states.Peek().Type == StateType.Property ? Token.GetNull() : Token.GetEndObject()); _states.Pop(); } break; case XmlNodeType.Text: switch (_states.Peek().Type) { case StateType.Property: _tokens.Enqueue(Token.GetValue(_xmlReader.Value)); break; case StateType.Object: _tokens.Enqueue(Token.GetPropertyName("#text")); _tokens.Enqueue(Token.GetValue(_xmlReader.Value)); break; } break; case XmlNodeType.EndElement: _level--; switch (_states.Peek().Type) { case StateType.Object: _tokens.Enqueue(Token.GetEndObject()); _states.Pop(); break; case StateType.Property: _states.Pop(); break; case StateType.Array: _tokens.Enqueue(Token.GetEndArray()); _states.Pop(); break; } break; } }