Пример #1
0
        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));
        }
Пример #2
0
        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;
            }
        }