private void WriteComplexElement(CompiledXPathNode node, XmlWriter writer) { writer.WriteStartElement(node.Prefix, node.LocalName, null); WriteSubnodes(node, writer, true); WriteSubnodes(node, writer, false); writer.WriteEndElement(); }
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); }
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); }
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); }
private void WriteValue(CompiledXPathNode node, XmlWriter writer) { if (node.Value == null) { return; } var value = Parent.AsRealizable <XPathNavigator>().Value.Evaluate(node.Value); writer.WriteValue(value); }
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)); }
private static bool ParsePredicateList(Tokenizer source, CompiledXPathNode parent) { while (Consume(source, Token.PredicateStart)) { if (!ParsePredicate(source, parent)) { return(false); } } return(true); }
private void WriteNode(CompiledXPathNode node, XmlWriter writer) { if (node.IsAttribute) { WriteAttribute(node, writer); } else if (node.IsSimple) { WriteSimpleElement(node, writer); } else { WriteComplexElement(node, writer); } }
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(); } }
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); } } }
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); }
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); }
private void WriteNode(CompiledXPathNode node, XmlWriter writer) { if (node.IsAttribute) WriteAttribute(node, writer); else if (node.IsSimple) WriteSimpleElement(node, writer); else WriteComplexElement(node, writer); }
private void WriteComplexElement(CompiledXPathNode node, XmlWriter writer) { writer.WriteStartElement(node.Prefix, node.LocalName, null); WriteSubnodes(node, writer, true); WriteSubnodes(node, writer, false); writer.WriteEndElement(); }
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); }
private void WriteValue(CompiledXPathNode node, XmlWriter writer) { if (node.Value == null) return; var value = Parent.AsRealizable<XPathNavigator>().Value.Evaluate(node.Value); writer.WriteValue(value); }
private void WriteAttribute(CompiledXPathNode node, XmlWriter writer) { writer.WriteStartAttribute(node.Prefix, node.LocalName, null); WriteValue(node, writer); writer.WriteEndAttribute(); }
private void WriteSimpleElement(CompiledXPathNode node, XmlWriter writer) { writer.WriteStartElement(node.Prefix, node.LocalName, null); WriteValue(node, writer); writer.WriteEndElement(); }
private void WriteSimpleElement(CompiledXPathNode node, XmlWriter writer) { writer.WriteStartElement(node.Prefix, node.LocalName, null); WriteValue(node, writer); writer.WriteEndElement(); }
private static void LinkNodes(CompiledXPathNode previous, CompiledXPathNode next) { previous.NextNode = next; next.PreviousNode = previous; }
private void WriteAttribute(CompiledXPathNode node, XmlWriter writer) { writer.WriteStartAttribute(node.Prefix, node.LocalName, null); WriteValue(node, writer); writer.WriteEndAttribute(); }