Beispiel #1
0
 private void WriteComplexElement(CompiledXPathNode node, XmlWriter writer)
 {
     writer.WriteStartElement(node.Prefix, node.LocalName, null);
     WriteSubnodes(node, writer, true);
     WriteSubnodes(node, writer, false);
     writer.WriteEndElement();
 }
Beispiel #2
0
        private static bool ParseNode(
            Tokenizer source,
            CompiledXPathNode parent,
            ref CompiledXPathNode node
            )
        {
            var previous = node;

            if (!ParseNodeCore(source, NodeFactory, ref node))
            {
                return(false);
            }

            if (node != previous)
            {
                if (previous == null)
                {
                    parent.Dependencies.Add(node);
                }
                else
                {
                    LinkNodes(previous, node);
                }
            }
            return(true);
        }
Beispiel #3
0
        private static bool ParseQualifiedName(Tokenizer source, CompiledXPathNode node)
        {
            string nameA, nameB;

            if (!ParseName(source, out nameA))
            {
                return(false);
            }

            if (!Consume(source, Token.NameSeparator))
            {
                if (node != null)
                {
                    node.LocalName = nameA;
                }
                return(true);
            }

            if (!ParseName(source, out nameB))
            {
                return(false);
            }

            if (node != null)
            {
                node.Prefix    = nameA;
                node.LocalName = nameB;
            }
            return(true);
        }
Beispiel #4
0
        private static bool ParseNestedPath(Tokenizer source, CompiledXPathNode parent, out CompiledXPathNode node)
        {
            for (node = null;;)
            {
                if (!ParseNode(source, parent, ref node))
                {
                    return(false);
                }
                if (!Consume(source, Token.StepSeparator))
                {
                    break;
                }
                if (node.IsAttribute)
                {
                    return(false);
                }
            }

            if (node == null)
            {
                var dependencies = parent.Dependencies;
                if (dependencies.Count != 0)
                {
                    return(false);
                }
                dependencies.Add(node = NodeFactory());                 // Self-reference
            }
            return(true);
        }
Beispiel #5
0
        private void WriteValue(CompiledXPathNode node, XmlWriter writer)
        {
            if (node.Value == null)
            {
                return;
            }

            var value = Parent.AsRealizable <XPathNavigator>().Value.Evaluate(node.Value);

            writer.WriteValue(value);
        }
Beispiel #6
0
        private static bool ParseExpression(Tokenizer source, CompiledXPathNode parent)
        {
            var isLeftToRight
                = source.Token == Token.Name ||
                  source.Token == Token.AttributeStart ||
                  source.Token == Token.SelfReference;

            return((isLeftToRight)
                                ? ParseLeftToRightExpression(source, parent)
                                : ParseRightToLeftExpression(source, parent));
        }
Beispiel #7
0
        private static bool ParsePredicateList(Tokenizer source, CompiledXPathNode parent)
        {
            while (Consume(source, Token.PredicateStart))
            {
                if (!ParsePredicate(source, parent))
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #8
0
 private void WriteNode(CompiledXPathNode node, XmlWriter writer)
 {
     if (node.IsAttribute)
     {
         WriteAttribute(node, writer);
     }
     else if (node.IsSimple)
     {
         WriteSimpleElement(node, writer);
     }
     else
     {
         WriteComplexElement(node, writer);
     }
 }
Beispiel #9
0
        private static bool ParseAndExpression(Tokenizer source, CompiledXPathNode parent)
        {
            for (;;)
            {
                if (!ParseExpression(source, parent))
                {
                    return(false);
                }

                if (source.Token != Token.Name || source.Text != "and")
                {
                    return(true);
                }
                source.Consume();
            }
        }
Beispiel #10
0
        private void WriteSubnodes(CompiledXPathNode parent, XmlWriter writer, bool attributes)
        {
            var next = parent.NextNode;

            if (next != null && next.IsAttribute == attributes)
            {
                WriteNode(next, writer);
            }

            foreach (var node in parent.Dependencies)
            {
                if (node.IsAttribute == attributes)
                {
                    WriteNode(node, writer);
                }
            }
        }
Beispiel #11
0
        private static bool ParsePredicate(Tokenizer source, CompiledXPathNode parent)
        {
            // Don't need to check this; caller must have already checked it.
            //if (!Consume(source, Token.PredicateStart))
            //    return false;

            if (!ParseAndExpression(source, parent))
            {
                return(false);
            }

            if (!Consume(source, Token.PredicateEnd))
            {
                return(false);
            }

            return(true);
        }
Beispiel #12
0
        private static bool ParseRightToLeftExpression(Tokenizer source, CompiledXPathNode parent)
        {
            XPathExpression value;

            if (!ParseValue(source, out value))
            {
                return(false);
            }

            if (!Consume(source, Token.EqualsOperator))
            {
                return(false);
            }

            CompiledXPathNode node;

            if (!ParseNestedPath(source, parent, out node))
            {
                return(false);
            }

            node.Value = value;
            return(true);
        }
Beispiel #13
0
		private void WriteNode(CompiledXPathNode node, XmlWriter writer)
		{
			if (node.IsAttribute)
				WriteAttribute(node, writer);
			else if (node.IsSimple)
				WriteSimpleElement(node, writer);
			else
				WriteComplexElement(node, writer);
		}
Beispiel #14
0
		private void WriteComplexElement(CompiledXPathNode node, XmlWriter writer)
		{
			writer.WriteStartElement(node.Prefix, node.LocalName, null);
			WriteSubnodes(node, writer, true);
			WriteSubnodes(node, writer, false);
			writer.WriteEndElement();
		}
Beispiel #15
0
		private void WriteSubnodes(CompiledXPathNode parent, XmlWriter writer, bool attributes)
		{
			var next = parent.NextNode;
			if (next != null && next.IsAttribute == attributes)
				WriteNode(next, writer);

			foreach (var node in parent.Dependencies)
				if (node.IsAttribute == attributes)
					WriteNode(node, writer);
		}
Beispiel #16
0
		private void WriteValue(CompiledXPathNode node, XmlWriter writer)
		{
			if (node.Value == null)
				return;

			var value = Parent.AsRealizable<XPathNavigator>().Value.Evaluate(node.Value);
			writer.WriteValue(value);
		}
Beispiel #17
0
 private void WriteAttribute(CompiledXPathNode node, XmlWriter writer)
 {
     writer.WriteStartAttribute(node.Prefix, node.LocalName, null);
     WriteValue(node, writer);
     writer.WriteEndAttribute();
 }
Beispiel #18
0
		private void WriteSimpleElement(CompiledXPathNode node, XmlWriter writer)
		{
			writer.WriteStartElement(node.Prefix, node.LocalName, null);
			WriteValue(node, writer);
			writer.WriteEndElement();
		}
Beispiel #19
0
 private void WriteSimpleElement(CompiledXPathNode node, XmlWriter writer)
 {
     writer.WriteStartElement(node.Prefix, node.LocalName, null);
     WriteValue(node, writer);
     writer.WriteEndElement();
 }
Beispiel #20
0
 private static void LinkNodes(CompiledXPathNode previous, CompiledXPathNode next)
 {
     previous.NextNode = next;
     next.PreviousNode = previous;
 }
Beispiel #21
0
		private void WriteAttribute(CompiledXPathNode node, XmlWriter writer)
		{
			writer.WriteStartAttribute(node.Prefix, node.LocalName, null);
			WriteValue(node, writer);
			writer.WriteEndAttribute();
		}