Hi;
I am sure I am missing something here but I cannot figure it out. Below I
have a program and I cannot figure out why the xpath selects that throw an
exception fail. From what I know they should work.
Also the second nav.OuterXml appears to also be wrong to me.
Can someone explain to me why this does not work? (This is an example from a
program we have where xpath can be entered in two parts so we have to be able
to handle this. We can't just always require the fill
/order/product[.='software'].)
Program below sig.
--
thanks - dave
david_at_windward_dot_net http://www.windwardreports.com
Program.cs:
using System.Xml;
using System.Xml.XPath;
using System;
using System.IO;
namespace XPathSample
{
class Program
{
static void Main(string[] args)
{
string xml =
"<order>" +
"<product>software</product>" +
"<product>software</product>" +
"</order>";
XPathDocument doc = new XPathDocument(new StringReader(xml));
// this works
XPathNavigator nav = doc.CreateNavigator();
XPathNavigator rtn = nav.SelectSingleNode("/order/product[.='software']");
Console.Out.WriteLine("nav(/) = " + nav.OuterXml);
Console.Out.WriteLine("/order/product[.='software'] = " + rtn.OuterXml);
// this works although the nav.OuterXml appears wrong
nav = nav.SelectSingleNode("/order");
rtn = nav.SelectSingleNode("product[.='software']");
Console.Out.WriteLine("nav(/order) = " + nav.OuterXml);
Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml);
// this works (same as prev)
rtn = nav.SelectSingleNode("./product[.='software']");
Console.Out.WriteLine("./product[.='software'] = " + rtn.OuterXml);
nav = nav.SelectSingleNode("product");
Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml);
// these all fail - WHY?
try
{
rtn = nav.SelectSingleNode("[.='software']");
}
catch (XPathException ex)
{
Console.Out.WriteLine("[.='software'] exception = " + ex.Message);
}
try
{
rtn = nav.SelectSingleNode("./[.='software']");
}
catch (XPathException ex)
{
Console.Out.WriteLine("./[.='software'] exception = " + ex.Message);
}
// yes this works - but I need the node as it does have a value.
object obj = nav.Evaluate(".='software'");
Console.Out.WriteLine(".='software' evaluate = " + obj);
Console.Out.WriteLine("all done");
}
}
} 9 2107
> // these all fail - WHY?
because of a common feature -- they all have invalid XPath syntax. try { rtn = nav.SelectSingleNode("[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("[.='software'] exception = " + ex.Message); } try { rtn = nav.SelectSingleNode("./[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); }
// yes this works - but I need the node as it does have a value. object obj = nav.Evaluate(".='software'"); Console.Out.WriteLine(".='software' evaluate = " + obj);
Try:
"self::*[.='software']"
or
"string(self::*[.='software'])"
depending on whether you need the node or its string value returned.
Cheers,
Dimitre Novatchev
"David Thielen" <da***@bogus.windward.net> wrote in message
news:74**********************************@microsof t.com... Hi;
I am sure I am missing something here but I cannot figure it out. Below I have a program and I cannot figure out why the xpath selects that throw an exception fail. From what I know they should work.
Also the second nav.OuterXml appears to also be wrong to me.
Can someone explain to me why this does not work? (This is an example from a program we have where xpath can be entered in two parts so we have to be able to handle this. We can't just always require the fill /order/product[.='software'].)
Program below sig.
-- thanks - dave david_at_windward_dot_net http://www.windwardreports.com
Program.cs: using System.Xml; using System.Xml.XPath; using System; using System.IO;
namespace XPathSample { class Program { static void Main(string[] args) {
string xml = "<order>" + "<product>software</product>" + "<product>software</product>" + "</order>"; XPathDocument doc = new XPathDocument(new StringReader(xml));
// this works XPathNavigator nav = doc.CreateNavigator(); XPathNavigator rtn = nav.SelectSingleNode("/order/product[.='software']"); Console.Out.WriteLine("nav(/) = " + nav.OuterXml); Console.Out.WriteLine("/order/product[.='software'] = " + rtn.OuterXml);
// this works although the nav.OuterXml appears wrong nav = nav.SelectSingleNode("/order"); rtn = nav.SelectSingleNode("product[.='software']"); Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml);
// this works (same as prev) rtn = nav.SelectSingleNode("./product[.='software']"); Console.Out.WriteLine("./product[.='software'] = " + rtn.OuterXml);
nav = nav.SelectSingleNode("product"); Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml);
// these all fail - WHY? try { rtn = nav.SelectSingleNode("[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("[.='software'] exception = " + ex.Message); } try { rtn = nav.SelectSingleNode("./[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); }
// yes this works - but I need the node as it does have a value. object obj = nav.Evaluate(".='software'"); Console.Out.WriteLine(".='software' evaluate = " + obj);
Console.Out.WriteLine("all done"); } } }
Hello;
I assumed it is invalid syntax. My question is why? I don't understand why
"[.='software']" or some variation of that is invalid.
--
thanks - dave
david_at_windward_dot_net http://www.windwardreports.com
"Dimitre Novatchev" wrote: // these all fail - WHY?
because of a common feature -- they all have invalid XPath syntax.
try { rtn = nav.SelectSingleNode("[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("[.='software'] exception = " + ex.Message); } try { rtn = nav.SelectSingleNode("./[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); }
// yes this works - but I need the node as it does have a value. object obj = nav.Evaluate(".='software'"); Console.Out.WriteLine(".='software' evaluate = " + obj);
Try:
"self::*[.='software']"
or
"string(self::*[.='software'])"
depending on whether you need the node or its string value returned.
Cheers, Dimitre Novatchev
"David Thielen" <da***@bogus.windward.net> wrote in message news:74**********************************@microsof t.com... Hi;
I am sure I am missing something here but I cannot figure it out. Below I have a program and I cannot figure out why the xpath selects that throw an exception fail. From what I know they should work.
Also the second nav.OuterXml appears to also be wrong to me.
Can someone explain to me why this does not work? (This is an example from a program we have where xpath can be entered in two parts so we have to be able to handle this. We can't just always require the fill /order/product[.='software'].)
Program below sig.
-- thanks - dave david_at_windward_dot_net http://www.windwardreports.com
Program.cs: using System.Xml; using System.Xml.XPath; using System; using System.IO;
namespace XPathSample { class Program { static void Main(string[] args) {
string xml = "<order>" + "<product>software</product>" + "<product>software</product>" + "</order>"; XPathDocument doc = new XPathDocument(new StringReader(xml));
// this works XPathNavigator nav = doc.CreateNavigator(); XPathNavigator rtn = nav.SelectSingleNode("/order/product[.='software']"); Console.Out.WriteLine("nav(/) = " + nav.OuterXml); Console.Out.WriteLine("/order/product[.='software'] = " + rtn.OuterXml);
// this works although the nav.OuterXml appears wrong nav = nav.SelectSingleNode("/order"); rtn = nav.SelectSingleNode("product[.='software']"); Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml);
// this works (same as prev) rtn = nav.SelectSingleNode("./product[.='software']"); Console.Out.WriteLine("./product[.='software'] = " + rtn.OuterXml);
nav = nav.SelectSingleNode("product"); Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml);
// these all fail - WHY? try { rtn = nav.SelectSingleNode("[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("[.='software'] exception = " + ex.Message); } try { rtn = nav.SelectSingleNode("./[.='software']"); } catch (XPathException ex) { Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); }
// yes this works - but I need the node as it does have a value. object obj = nav.Evaluate(".='software'"); Console.Out.WriteLine(".='software' evaluate = " + obj);
Console.Out.WriteLine("all done"); } } }
"David Thielen" <da***@bogus.windward.net> wrote in message
news:24**********************************@microsof t.com... Hello;
I assumed it is invalid syntax. My question is why? I don't understand why "[.='software']" or some variation of that is invalid.
Read the XPath 1.0 Spec.
It says: http://www.w3.org/TR/xpath#predicates
"A predicate filters a node-set with respect to an axis to produce a new
node-set. For each node in the node-set to be filtered, the PredicateExpr is
evaluated with that node as the context node, with the number of nodes in
the node-set as the context size, and with the proximity position of the
node in the node-set with respect to the axis as the context position; if
PredicateExpr evaluates to true for that node, the node is included in the
new node-set; otherwise, it is not included."
So, a predicate can only apear after some XPath expression and filters it. A
predicate, alone, is not a valid XPath expression.
This is also made clear if we look at the BNF grammar definition of XPath
1.0. Of all rules only rule [4] and rule [20] contain the nonterminal symbol
predicate and it is always not the leading symbol (of the RHS): http://www.w3.org/TR/xpath#section-Location-Steps
[4] Step ::= AxisSpecifier NodeTest Predicate*
| AbbreviatedStep http://www.w3.org/TR/xpath#node-sets
[20] FilterExpr ::= PrimaryExpr
| FilterExpr Predicate
I hope that this answers completely your question.
Cheers,
Dimitre Novatchev -- thanks - dave david_at_windward_dot_net http://www.windwardreports.com "Dimitre Novatchev" wrote:
> // these all fail - WHY?
because of a common feature -- they all have invalid XPath syntax.
> try > { > rtn = nav.SelectSingleNode("[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); > } > try > { > rtn = nav.SelectSingleNode("./[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); > } > > // yes this works - but I need the node as it does have a value. > object obj = nav.Evaluate(".='software'"); > Console.Out.WriteLine(".='software' evaluate = " + obj);
Try:
"self::*[.='software']"
or
"string(self::*[.='software'])"
depending on whether you need the node or its string value returned.
Cheers, Dimitre Novatchev
"David Thielen" <da***@bogus.windward.net> wrote in message news:74**********************************@microsof t.com... > Hi; > > I am sure I am missing something here but I cannot figure it out. Below > I > have a program and I cannot figure out why the xpath selects that throw > an > exception fail. From what I know they should work. > > Also the second nav.OuterXml appears to also be wrong to me. > > Can someone explain to me why this does not work? (This is an example > from > a > program we have where xpath can be entered in two parts so we have to > be > able > to handle this. We can't just always require the fill > /order/product[.='software'].) > > Program below sig. > > -- > thanks - dave > david_at_windward_dot_net > http://www.windwardreports.com > > Program.cs: > using System.Xml; > using System.Xml.XPath; > using System; > using System.IO; > > namespace XPathSample > { > class Program > { > static void Main(string[] args) > { > > string xml = > "<order>" + > "<product>software</product>" + > "<product>software</product>" + > "</order>"; > XPathDocument doc = new XPathDocument(new StringReader(xml)); > > // this works > XPathNavigator nav = doc.CreateNavigator(); > XPathNavigator rtn = > nav.SelectSingleNode("/order/product[.='software']"); > Console.Out.WriteLine("nav(/) = " + nav.OuterXml); > Console.Out.WriteLine("/order/product[.='software'] = " + > rtn.OuterXml); > > // this works although the nav.OuterXml appears wrong > nav = nav.SelectSingleNode("/order"); > rtn = nav.SelectSingleNode("product[.='software']"); > Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); > Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml); > > // this works (same as prev) > rtn = nav.SelectSingleNode("./product[.='software']"); > Console.Out.WriteLine("./product[.='software'] = " + rtn.OuterXml); > > nav = nav.SelectSingleNode("product"); > Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml); > > // these all fail - WHY? > try > { > rtn = nav.SelectSingleNode("[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); > } > try > { > rtn = nav.SelectSingleNode("./[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); > } > > // yes this works - but I need the node as it does have a value. > object obj = nav.Evaluate(".='software'"); > Console.Out.WriteLine(".='software' evaluate = " + obj); > > > Console.Out.WriteLine("all done"); > } > } > } > >
Hi;
First, thanks for helping on this I really appreciate it.
Ok, I see that the xpath must start with "." to get it to the node and the
"[...]" then modifies that - makes sense.
But then, shouldn't ".[.='software']" or "./.[.='software']" or
"./[.='software']" work.
In the case of ".[.='software']" isn't that saying start with the node "."
(which exists) and then return all where .='software'?
--
thanks - dave
david_at_windward_dot_net http://www.windwardreports.com
"Dimitre Novatchev" wrote: "David Thielen" <da***@bogus.windward.net> wrote in message news:24**********************************@microsof t.com... Hello;
I assumed it is invalid syntax. My question is why? I don't understand why "[.='software']" or some variation of that is invalid.
Read the XPath 1.0 Spec.
It says:
http://www.w3.org/TR/xpath#predicates
"A predicate filters a node-set with respect to an axis to produce a new node-set. For each node in the node-set to be filtered, the PredicateExpr is evaluated with that node as the context node, with the number of nodes in the node-set as the context size, and with the proximity position of the node in the node-set with respect to the axis as the context position; if PredicateExpr evaluates to true for that node, the node is included in the new node-set; otherwise, it is not included." So, a predicate can only apear after some XPath expression and filters it. A predicate, alone, is not a valid XPath expression.
This is also made clear if we look at the BNF grammar definition of XPath 1.0. Of all rules only rule [4] and rule [20] contain the nonterminal symbol predicate and it is always not the leading symbol (of the RHS): http://www.w3.org/TR/xpath#section-Location-Steps
[4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
http://www.w3.org/TR/xpath#node-sets [20] FilterExpr ::= PrimaryExpr | FilterExpr Predicate
I hope that this answers completely your question.
Cheers, Dimitre Novatchev -- thanks - dave david_at_windward_dot_net http://www.windwardreports.com "Dimitre Novatchev" wrote:
> // these all fail - WHY?
because of a common feature -- they all have invalid XPath syntax.
> try > { > rtn = nav.SelectSingleNode("[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); > } > try > { > rtn = nav.SelectSingleNode("./[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); > } > > // yes this works - but I need the node as it does have a value. > object obj = nav.Evaluate(".='software'"); > Console.Out.WriteLine(".='software' evaluate = " + obj);
Try:
"self::*[.='software']"
or
"string(self::*[.='software'])"
depending on whether you need the node or its string value returned.
Cheers, Dimitre Novatchev
"David Thielen" <da***@bogus.windward.net> wrote in message news:74**********************************@microsof t.com... > Hi; > > I am sure I am missing something here but I cannot figure it out. Below > I > have a program and I cannot figure out why the xpath selects that throw > an > exception fail. From what I know they should work. > > Also the second nav.OuterXml appears to also be wrong to me. > > Can someone explain to me why this does not work? (This is an example > from > a > program we have where xpath can be entered in two parts so we have to > be > able > to handle this. We can't just always require the fill > /order/product[.='software'].) > > Program below sig. > > -- > thanks - dave > david_at_windward_dot_net > http://www.windwardreports.com > > Program.cs: > using System.Xml; > using System.Xml.XPath; > using System; > using System.IO; > > namespace XPathSample > { > class Program > { > static void Main(string[] args) > { > > string xml = > "<order>" + > "<product>software</product>" + > "<product>software</product>" + > "</order>"; > XPathDocument doc = new XPathDocument(new StringReader(xml)); > > // this works > XPathNavigator nav = doc.CreateNavigator(); > XPathNavigator rtn = > nav.SelectSingleNode("/order/product[.='software']"); > Console.Out.WriteLine("nav(/) = " + nav.OuterXml); > Console.Out.WriteLine("/order/product[.='software'] = " + > rtn.OuterXml); > > // this works although the nav.OuterXml appears wrong > nav = nav.SelectSingleNode("/order"); > rtn = nav.SelectSingleNode("product[.='software']"); > Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); > Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml); > > // this works (same as prev) > rtn = nav.SelectSingleNode("./product[.='software']"); > Console.Out.WriteLine("./product[.='software'] = " + rtn.OuterXml); > > nav = nav.SelectSingleNode("product"); > Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml); > > // these all fail - WHY? > try > { > rtn = nav.SelectSingleNode("[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); > } > try > { > rtn = nav.SelectSingleNode("./[.='software']"); > } > catch (XPathException ex) > { > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); > } > > // yes this works - but I need the node as it does have a value. > object obj = nav.Evaluate(".='software'"); > Console.Out.WriteLine(".='software' evaluate = " + obj); > > > Console.Out.WriteLine("all done"); > } > } > } > >
"David Thielen" <da***@bogus.windward.net> wrote in message
news:DA**********************************@microsof t.com... Hi;
First, thanks for helping on this I really appreciate it.
Ok, I see that the xpath must start with "." to get it to the node and the "[...]" then modifies that - makes sense.
But then, shouldn't ".[.='software']" or "./.[.='software']" or
No, the syntax rules do not allow this: [4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
as we can see, Predicatecan only occur after a NodeTest , not after an
AbbreviatedStep.
"./[.='software']" work.
Again, Predicate cannot be the leftmost symbol in a step In the case of ".[.='software']" isn't that saying start with the node "." (which exists) and then return all where .='software'?
This may seem a clear semantics, but the syntax is invalid according to the
XPath 1.0 grammar rules.
As I said, use:
self::node()[.='software']
Cheers,
Dimitre Novatchev -- thanks - dave david_at_windward_dot_net http://www.windwardreports.com "Dimitre Novatchev" wrote:
"David Thielen" <da***@bogus.windward.net> wrote in message news:24**********************************@microsof t.com... > Hello; > > I assumed it is invalid syntax. My question is why? I don't understand > why > "[.='software']" or some variation of that is invalid.
Read the XPath 1.0 Spec.
It says:
http://www.w3.org/TR/xpath#predicates
"A predicate filters a node-set with respect to an axis to produce a new node-set. For each node in the node-set to be filtered, the PredicateExpr is evaluated with that node as the context node, with the number of nodes in the node-set as the context size, and with the proximity position of the node in the node-set with respect to the axis as the context position; if PredicateExpr evaluates to true for that node, the node is included in the new node-set; otherwise, it is not included." So, a predicate can only apear after some XPath expression and filters it. A predicate, alone, is not a valid XPath expression.
This is also made clear if we look at the BNF grammar definition of XPath 1.0. Of all rules only rule [4] and rule [20] contain the nonterminal symbol predicate and it is always not the leading symbol (of the RHS): http://www.w3.org/TR/xpath#section-Location-Steps
[4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
http://www.w3.org/TR/xpath#node-sets [20] FilterExpr ::= PrimaryExpr | FilterExpr Predicate
I hope that this answers completely your question.
Cheers, Dimitre Novatchev > > -- > thanks - dave > david_at_windward_dot_net > http://www.windwardreports.com > > > > "Dimitre Novatchev" wrote: > >> > // these all fail - WHY? >> >> because of a common feature -- they all have invalid XPath syntax. >> >> > try >> > { >> > rtn = nav.SelectSingleNode("[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); >> > } >> > try >> > { >> > rtn = nav.SelectSingleNode("./[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); >> > } >> > >> > // yes this works - but I need the node as it does have a value. >> > object obj = nav.Evaluate(".='software'"); >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> >> Try: >> >> "self::*[.='software']" >> >> or >> >> "string(self::*[.='software'])" >> >> depending on whether you need the node or its string value returned. >> >> >> Cheers, >> Dimitre Novatchev >> >> >> >> >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> news:74**********************************@microsof t.com... >> > Hi; >> > >> > I am sure I am missing something here but I cannot figure it out. >> > Below >> > I >> > have a program and I cannot figure out why the xpath selects that >> > throw >> > an >> > exception fail. From what I know they should work. >> > >> > Also the second nav.OuterXml appears to also be wrong to me. >> > >> > Can someone explain to me why this does not work? (This is an >> > example >> > from >> > a >> > program we have where xpath can be entered in two parts so we have >> > to >> > be >> > able >> > to handle this. We can't just always require the fill >> > /order/product[.='software'].) >> > >> > Program below sig. >> > >> > -- >> > thanks - dave >> > david_at_windward_dot_net >> > http://www.windwardreports.com >> > >> > Program.cs: >> > using System.Xml; >> > using System.Xml.XPath; >> > using System; >> > using System.IO; >> > >> > namespace XPathSample >> > { >> > class Program >> > { >> > static void Main(string[] args) >> > { >> > >> > string xml = >> > "<order>" + >> > "<product>software</product>" + >> > "<product>software</product>" + >> > "</order>"; >> > XPathDocument doc = new XPathDocument(new StringReader(xml)); >> > >> > // this works >> > XPathNavigator nav = doc.CreateNavigator(); >> > XPathNavigator rtn = >> > nav.SelectSingleNode("/order/product[.='software']"); >> > Console.Out.WriteLine("nav(/) = " + nav.OuterXml); >> > Console.Out.WriteLine("/order/product[.='software'] = " + >> > rtn.OuterXml); >> > >> > // this works although the nav.OuterXml appears wrong >> > nav = nav.SelectSingleNode("/order"); >> > rtn = nav.SelectSingleNode("product[.='software']"); >> > Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); >> > Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml); >> > >> > // this works (same as prev) >> > rtn = nav.SelectSingleNode("./product[.='software']"); >> > Console.Out.WriteLine("./product[.='software'] = " + rtn.OuterXml); >> > >> > nav = nav.SelectSingleNode("product"); >> > Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml); >> > >> > // these all fail - WHY? >> > try >> > { >> > rtn = nav.SelectSingleNode("[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); >> > } >> > try >> > { >> > rtn = nav.SelectSingleNode("./[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); >> > } >> > >> > // yes this works - but I need the node as it does have a value. >> > object obj = nav.Evaluate(".='software'"); >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> > >> > >> > Console.Out.WriteLine("all done"); >> > } >> > } >> > } >> > >> > >> >> >>
Hello;
Is this correct to say:
"/order/software" or "software" in each case is an axis specifier while "."
is an abbreviated step?
I had thought both were a way of specifing a node and therefore were an
axisSpecifier.
Also, any good book(s) or website(s) that explain this, preferably by example?
--
thanks - dave
david_at_windward_dot_net http://www.windwardreports.com
"Dimitre Novatchev" wrote: "David Thielen" <da***@bogus.windward.net> wrote in message news:DA**********************************@microsof t.com... Hi;
First, thanks for helping on this I really appreciate it.
Ok, I see that the xpath must start with "." to get it to the node and the "[...]" then modifies that - makes sense.
But then, shouldn't ".[.='software']" or "./.[.='software']" or
No, the syntax rules do not allow this:
[4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
as we can see, Predicatecan only occur after a NodeTest , not after an AbbreviatedStep.
"./[.='software']" work.
Again, Predicate cannot be the leftmost symbol in a step
In the case of ".[.='software']" isn't that saying start with the node "." (which exists) and then return all where .='software'?
This may seem a clear semantics, but the syntax is invalid according to the XPath 1.0 grammar rules.
As I said, use:
self::node()[.='software'] Cheers, Dimitre Novatchev
-- thanks - dave david_at_windward_dot_net http://www.windwardreports.com "Dimitre Novatchev" wrote:
"David Thielen" <da***@bogus.windward.net> wrote in message news:24**********************************@microsof t.com... > Hello; > > I assumed it is invalid syntax. My question is why? I don't understand > why > "[.='software']" or some variation of that is invalid.
Read the XPath 1.0 Spec.
It says:
http://www.w3.org/TR/xpath#predicates
"A predicate filters a node-set with respect to an axis to produce a new node-set. For each node in the node-set to be filtered, the PredicateExpr is evaluated with that node as the context node, with the number of nodes in the node-set as the context size, and with the proximity position of the node in the node-set with respect to the axis as the context position; if PredicateExpr evaluates to true for that node, the node is included in the new node-set; otherwise, it is not included." So, a predicate can only apear after some XPath expression and filters it. A predicate, alone, is not a valid XPath expression.
This is also made clear if we look at the BNF grammar definition of XPath 1.0. Of all rules only rule [4] and rule [20] contain the nonterminal symbol predicate and it is always not the leading symbol (of the RHS): http://www.w3.org/TR/xpath#section-Location-Steps
[4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
http://www.w3.org/TR/xpath#node-sets [20] FilterExpr ::= PrimaryExpr | FilterExpr Predicate
I hope that this answers completely your question.
Cheers, Dimitre Novatchev > > -- > thanks - dave > david_at_windward_dot_net > http://www.windwardreports.com > > > > "Dimitre Novatchev" wrote: > >> > // these all fail - WHY? >> >> because of a common feature -- they all have invalid XPath syntax. >> >> > try >> > { >> > rtn = nav.SelectSingleNode("[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); >> > } >> > try >> > { >> > rtn = nav.SelectSingleNode("./[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); >> > } >> > >> > // yes this works - but I need the node as it does have a value. >> > object obj = nav.Evaluate(".='software'"); >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> >> Try: >> >> "self::*[.='software']" >> >> or >> >> "string(self::*[.='software'])" >> >> depending on whether you need the node or its string value returned. >> >> >> Cheers, >> Dimitre Novatchev >> >> >> >> >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> news:74**********************************@microsof t.com... >> > Hi; >> > >> > I am sure I am missing something here but I cannot figure it out. >> > Below >> > I >> > have a program and I cannot figure out why the xpath selects that >> > throw >> > an >> > exception fail. From what I know they should work. >> > >> > Also the second nav.OuterXml appears to also be wrong to me. >> > >> > Can someone explain to me why this does not work? (This is an >> > example >> > from >> > a >> > program we have where xpath can be entered in two parts so we have >> > to >> > be >> > able >> > to handle this. We can't just always require the fill >> > /order/product[.='software'].) >> > >> > Program below sig. >> > >> > -- >> > thanks - dave >> > david_at_windward_dot_net >> > http://www.windwardreports.com >> > >> > Program.cs: >> > using System.Xml; >> > using System.Xml.XPath; >> > using System; >> > using System.IO; >> > >> > namespace XPathSample >> > { >> > class Program >> > { >> > static void Main(string[] args) >> > { >> > >> > string xml = >> > "<order>" + >> > "<product>software</product>" + >> > "<product>software</product>" + >> > "</order>"; >> > XPathDocument doc = new XPathDocument(new StringReader(xml)); >> > >> > // this works >> > XPathNavigator nav = doc.CreateNavigator(); >> > XPathNavigator rtn = >> > nav.SelectSingleNode("/order/product[.='software']"); >> > Console.Out.WriteLine("nav(/) = " + nav.OuterXml); >> > Console.Out.WriteLine("/order/product[.='software'] = " + >> > rtn.OuterXml); >> > >> > // this works although the nav.OuterXml appears wrong >> > nav = nav.SelectSingleNode("/order"); >> > rtn = nav.SelectSingleNode("product[.='software']"); >> > Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); >> > Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml); >> > >> > // this works (same as prev) >> > rtn = nav.SelectSingleNode("./product[.='software']"); >> > Console.Out.WriteLine("./product[.='software'] = " + rtn.OuterXml); >> > >> > nav = nav.SelectSingleNode("product"); >> > Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml); >> > >> > // these all fail - WHY? >> > try >> > { >> > rtn = nav.SelectSingleNode("[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("[.='software'] exception = " + ex.Message); >> > } >> > try >> > { >> > rtn = nav.SelectSingleNode("./[.='software']"); >> > } >> > catch (XPathException ex) >> > { >> > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message); >> > } >> > >> > // yes this works - but I need the node as it does have a value. >> > object obj = nav.Evaluate(".='software'"); >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> > >> > >> > Console.Out.WriteLine("all done"); >> > } >> > } >> > } >> > >> > >> >> >>
"David Thielen" <da***@bogus.windward.net> wrote in message
news:2D**********************************@microsof t.com... Hello;
Is this correct to say: "/order/software" or "software" in each case is an axis specifier
No, Axis specifier can be only a predefined (full) name out of 13 axis names
(see below) or an abbreviated axis specifier (just "@").
while "." is an abbreviated step?
I had thought both were a way of specifing a node and therefore were an axisSpecifier.
No.
The rules from the spec:
[5] AxisSpecifier ::= AxisName '::'
| AbbreviatedAxisSpecifier
[6] AxisName ::= 'ancestor'
| 'ancestor-or-self'
| 'attribute'
| 'child'
| 'descendant'
| 'descendant-or-self'
| 'following'
| 'following-sibling'
| 'namespace'
| 'parent'
| 'preceding'
| 'preceding-sibling'
| 'self'
[13] AbbreviatedAxisSpecifier ::= '@'? Also, any good book(s) or website(s) that explain this, preferably by example?
Michael Kay's books on XSLT 1.0, XSLT 2.0 and XPath 2.0 http://www.amazon.com/gp/product/186...lance&n=283155 http://www.amazon.com/gp/product/076...lance&n=283155 http://www.amazon.com/gp/product/076...lance&n=283155
Jeni Tennison's books on the same topics. http://www.amazon.com/gp/product/159...lance&n=283155 http://www.amazon.com/gp/product/076...lance&n=283155 http://www.amazon.com/gp/product/159...lance&n=283155
Hope this helped.
Cheers,
Dimitre Novatchev. -- thanks - dave david_at_windward_dot_net http://www.windwardreports.com "Dimitre Novatchev" wrote:
"David Thielen" <da***@bogus.windward.net> wrote in message news:DA**********************************@microsof t.com... > Hi; > > First, thanks for helping on this I really appreciate it. > > Ok, I see that the xpath must start with "." to get it to the node and > the > "[...]" then modifies that - makes sense. > > But then, shouldn't ".[.='software']" or "./.[.='software']" or
No, the syntax rules do not allow this:
>> [4] Step ::= AxisSpecifier NodeTest Predicate* >> | AbbreviatedStep
as we can see, Predicatecan only occur after a NodeTest , not after an AbbreviatedStep.
> "./[.='software']" work.
Again, Predicate cannot be the leftmost symbol in a step
> > In the case of ".[.='software']" isn't that saying start with the node > "." > (which exists) and then return all where .='software'?
This may seem a clear semantics, but the syntax is invalid according to the XPath 1.0 grammar rules.
As I said, use:
self::node()[.='software'] Cheers, Dimitre Novatchev
> > -- > thanks - dave > david_at_windward_dot_net > http://www.windwardreports.com > > > > "Dimitre Novatchev" wrote: > >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> news:24**********************************@microsof t.com... >> > Hello; >> > >> > I assumed it is invalid syntax. My question is why? I don't >> > understand >> > why >> > "[.='software']" or some variation of that is invalid. >> >> Read the XPath 1.0 Spec. >> >> It says: >> >> http://www.w3.org/TR/xpath#predicates >> >> "A predicate filters a node-set with respect to an axis to produce a >> new >> node-set. For each node in the node-set to be filtered, the >> PredicateExpr >> is >> evaluated with that node as the context node, with the number of nodes >> in >> the node-set as the context size, and with the proximity position of >> the >> node in the node-set with respect to the axis as the context position; >> if >> PredicateExpr evaluates to true for that node, the node is included in >> the >> new node-set; otherwise, it is not included." >> >> >> >> So, a predicate can only apear after some XPath expression and filters >> it. A >> predicate, alone, is not a valid XPath expression. >> >> This is also made clear if we look at the BNF grammar definition of >> XPath >> 1.0. Of all rules only rule [4] and rule [20] contain the nonterminal >> symbol >> predicate and it is always not the leading symbol (of the RHS): >> >> >> >> http://www.w3.org/TR/xpath#section-Location-Steps >> >> >> [4] Step ::= AxisSpecifier NodeTest Predicate* >> | AbbreviatedStep >> >> >> >> >> http://www.w3.org/TR/xpath#node-sets >> >> >> >> [20] FilterExpr ::= PrimaryExpr >> | FilterExpr Predicate >> >> >> >> >> I hope that this answers completely your question. >> >> >> Cheers, >> Dimitre Novatchev >> >> >> >> > >> > -- >> > thanks - dave >> > david_at_windward_dot_net >> > http://www.windwardreports.com >> > >> > >> > >> > "Dimitre Novatchev" wrote: >> > >> >> > // these all fail - WHY? >> >> >> >> because of a common feature -- they all have invalid XPath syntax. >> >> >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("./[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("./[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > >> >> > // yes this works - but I need the node as it does have a value. >> >> > object obj = nav.Evaluate(".='software'"); >> >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> >> >> >> >> Try: >> >> >> >> "self::*[.='software']" >> >> >> >> or >> >> >> >> "string(self::*[.='software'])" >> >> >> >> depending on whether you need the node or its string value >> >> returned. >> >> >> >> >> >> Cheers, >> >> Dimitre Novatchev >> >> >> >> >> >> >> >> >> >> >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> >> news:74**********************************@microsof t.com... >> >> > Hi; >> >> > >> >> > I am sure I am missing something here but I cannot figure it out. >> >> > Below >> >> > I >> >> > have a program and I cannot figure out why the xpath selects that >> >> > throw >> >> > an >> >> > exception fail. From what I know they should work. >> >> > >> >> > Also the second nav.OuterXml appears to also be wrong to me. >> >> > >> >> > Can someone explain to me why this does not work? (This is an >> >> > example >> >> > from >> >> > a >> >> > program we have where xpath can be entered in two parts so we >> >> > have >> >> > to >> >> > be >> >> > able >> >> > to handle this. We can't just always require the fill >> >> > /order/product[.='software'].) >> >> > >> >> > Program below sig. >> >> > >> >> > -- >> >> > thanks - dave >> >> > david_at_windward_dot_net >> >> > http://www.windwardreports.com >> >> > >> >> > Program.cs: >> >> > using System.Xml; >> >> > using System.Xml.XPath; >> >> > using System; >> >> > using System.IO; >> >> > >> >> > namespace XPathSample >> >> > { >> >> > class Program >> >> > { >> >> > static void Main(string[] args) >> >> > { >> >> > >> >> > string xml = >> >> > "<order>" + >> >> > "<product>software</product>" + >> >> > "<product>software</product>" + >> >> > "</order>"; >> >> > XPathDocument doc = new XPathDocument(new StringReader(xml)); >> >> > >> >> > // this works >> >> > XPathNavigator nav = doc.CreateNavigator(); >> >> > XPathNavigator rtn = >> >> > nav.SelectSingleNode("/order/product[.='software']"); >> >> > Console.Out.WriteLine("nav(/) = " + nav.OuterXml); >> >> > Console.Out.WriteLine("/order/product[.='software'] = " + >> >> > rtn.OuterXml); >> >> > >> >> > // this works although the nav.OuterXml appears wrong >> >> > nav = nav.SelectSingleNode("/order"); >> >> > rtn = nav.SelectSingleNode("product[.='software']"); >> >> > Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); >> >> > Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml); >> >> > >> >> > // this works (same as prev) >> >> > rtn = nav.SelectSingleNode("./product[.='software']"); >> >> > Console.Out.WriteLine("./product[.='software'] = " + >> >> > rtn.OuterXml); >> >> > >> >> > nav = nav.SelectSingleNode("product"); >> >> > Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml); >> >> > >> >> > // these all fail - WHY? >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("./[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("./[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > >> >> > // yes this works - but I need the node as it does have a value. >> >> > object obj = nav.Evaluate(".='software'"); >> >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> > >> >> > >> >> > Console.Out.WriteLine("all done"); >> >> > } >> >> > } >> >> > } >> >> > >> >> > >> >> >> >> >> >> >> >> >> >>
> Also, any good book(s) or website(s) that explain this, preferably by example?
I would recommend the XPath Visualizer as a proven tool for playing with
XPath and learning it "the fun way".
Cheers,
Dimitre Novatchev
"David Thielen" <da***@bogus.windward.net> wrote in message
news:2D**********************************@microsof t.com... Hello;
Is this correct to say: "/order/software" or "software" in each case is an axis specifier while "." is an abbreviated step?
I had thought both were a way of specifing a node and therefore were an axisSpecifier.
Also, any good book(s) or website(s) that explain this, preferably by example?
-- thanks - dave david_at_windward_dot_net http://www.windwardreports.com "Dimitre Novatchev" wrote:
"David Thielen" <da***@bogus.windward.net> wrote in message news:DA**********************************@microsof t.com... > Hi; > > First, thanks for helping on this I really appreciate it. > > Ok, I see that the xpath must start with "." to get it to the node and > the > "[...]" then modifies that - makes sense. > > But then, shouldn't ".[.='software']" or "./.[.='software']" or
No, the syntax rules do not allow this:
>> [4] Step ::= AxisSpecifier NodeTest Predicate* >> | AbbreviatedStep
as we can see, Predicatecan only occur after a NodeTest , not after an AbbreviatedStep.
> "./[.='software']" work.
Again, Predicate cannot be the leftmost symbol in a step
> > In the case of ".[.='software']" isn't that saying start with the node > "." > (which exists) and then return all where .='software'?
This may seem a clear semantics, but the syntax is invalid according to the XPath 1.0 grammar rules.
As I said, use:
self::node()[.='software'] Cheers, Dimitre Novatchev
> > -- > thanks - dave > david_at_windward_dot_net > http://www.windwardreports.com > > > > "Dimitre Novatchev" wrote: > >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> news:24**********************************@microsof t.com... >> > Hello; >> > >> > I assumed it is invalid syntax. My question is why? I don't >> > understand >> > why >> > "[.='software']" or some variation of that is invalid. >> >> Read the XPath 1.0 Spec. >> >> It says: >> >> http://www.w3.org/TR/xpath#predicates >> >> "A predicate filters a node-set with respect to an axis to produce a >> new >> node-set. For each node in the node-set to be filtered, the >> PredicateExpr >> is >> evaluated with that node as the context node, with the number of nodes >> in >> the node-set as the context size, and with the proximity position of >> the >> node in the node-set with respect to the axis as the context position; >> if >> PredicateExpr evaluates to true for that node, the node is included in >> the >> new node-set; otherwise, it is not included." >> >> >> >> So, a predicate can only apear after some XPath expression and filters >> it. A >> predicate, alone, is not a valid XPath expression. >> >> This is also made clear if we look at the BNF grammar definition of >> XPath >> 1.0. Of all rules only rule [4] and rule [20] contain the nonterminal >> symbol >> predicate and it is always not the leading symbol (of the RHS): >> >> >> >> http://www.w3.org/TR/xpath#section-Location-Steps >> >> >> [4] Step ::= AxisSpecifier NodeTest Predicate* >> | AbbreviatedStep >> >> >> >> >> http://www.w3.org/TR/xpath#node-sets >> >> >> >> [20] FilterExpr ::= PrimaryExpr >> | FilterExpr Predicate >> >> >> >> >> I hope that this answers completely your question. >> >> >> Cheers, >> Dimitre Novatchev >> >> >> >> > >> > -- >> > thanks - dave >> > david_at_windward_dot_net >> > http://www.windwardreports.com >> > >> > >> > >> > "Dimitre Novatchev" wrote: >> > >> >> > // these all fail - WHY? >> >> >> >> because of a common feature -- they all have invalid XPath syntax. >> >> >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("./[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("./[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > >> >> > // yes this works - but I need the node as it does have a value. >> >> > object obj = nav.Evaluate(".='software'"); >> >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> >> >> >> >> Try: >> >> >> >> "self::*[.='software']" >> >> >> >> or >> >> >> >> "string(self::*[.='software'])" >> >> >> >> depending on whether you need the node or its string value >> >> returned. >> >> >> >> >> >> Cheers, >> >> Dimitre Novatchev >> >> >> >> >> >> >> >> >> >> >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> >> news:74**********************************@microsof t.com... >> >> > Hi; >> >> > >> >> > I am sure I am missing something here but I cannot figure it out. >> >> > Below >> >> > I >> >> > have a program and I cannot figure out why the xpath selects that >> >> > throw >> >> > an >> >> > exception fail. From what I know they should work. >> >> > >> >> > Also the second nav.OuterXml appears to also be wrong to me. >> >> > >> >> > Can someone explain to me why this does not work? (This is an >> >> > example >> >> > from >> >> > a >> >> > program we have where xpath can be entered in two parts so we >> >> > have >> >> > to >> >> > be >> >> > able >> >> > to handle this. We can't just always require the fill >> >> > /order/product[.='software'].) >> >> > >> >> > Program below sig. >> >> > >> >> > -- >> >> > thanks - dave >> >> > david_at_windward_dot_net >> >> > http://www.windwardreports.com >> >> > >> >> > Program.cs: >> >> > using System.Xml; >> >> > using System.Xml.XPath; >> >> > using System; >> >> > using System.IO; >> >> > >> >> > namespace XPathSample >> >> > { >> >> > class Program >> >> > { >> >> > static void Main(string[] args) >> >> > { >> >> > >> >> > string xml = >> >> > "<order>" + >> >> > "<product>software</product>" + >> >> > "<product>software</product>" + >> >> > "</order>"; >> >> > XPathDocument doc = new XPathDocument(new StringReader(xml)); >> >> > >> >> > // this works >> >> > XPathNavigator nav = doc.CreateNavigator(); >> >> > XPathNavigator rtn = >> >> > nav.SelectSingleNode("/order/product[.='software']"); >> >> > Console.Out.WriteLine("nav(/) = " + nav.OuterXml); >> >> > Console.Out.WriteLine("/order/product[.='software'] = " + >> >> > rtn.OuterXml); >> >> > >> >> > // this works although the nav.OuterXml appears wrong >> >> > nav = nav.SelectSingleNode("/order"); >> >> > rtn = nav.SelectSingleNode("product[.='software']"); >> >> > Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); >> >> > Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml); >> >> > >> >> > // this works (same as prev) >> >> > rtn = nav.SelectSingleNode("./product[.='software']"); >> >> > Console.Out.WriteLine("./product[.='software'] = " + >> >> > rtn.OuterXml); >> >> > >> >> > nav = nav.SelectSingleNode("product"); >> >> > Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml); >> >> > >> >> > // these all fail - WHY? >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("./[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("./[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > >> >> > // yes this works - but I need the node as it does have a value. >> >> > object obj = nav.Evaluate(".='software'"); >> >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> > >> >> > >> >> > Console.Out.WriteLine("all done"); >> >> > } >> >> > } >> >> > } >> >> > >> >> > >> >> >> >> >> >> >> >> >> >>
> Also, any good book(s) or website(s) that explain this, preferably by example?
I would recommend the XPath Visualizer as a proven tool for playing with
XPath and learning it "the fun way".
Cheers,
Dimitre Novatchev
"David Thielen" <da***@bogus.windward.net> wrote in message
news:2D**********************************@microsof t.com... Hello;
Is this correct to say: "/order/software" or "software" in each case is an axis specifier while "." is an abbreviated step?
I had thought both were a way of specifing a node and therefore were an axisSpecifier.
Also, any good book(s) or website(s) that explain this, preferably by example?
-- thanks - dave david_at_windward_dot_net http://www.windwardreports.com "Dimitre Novatchev" wrote:
"David Thielen" <da***@bogus.windward.net> wrote in message news:DA**********************************@microsof t.com... > Hi; > > First, thanks for helping on this I really appreciate it. > > Ok, I see that the xpath must start with "." to get it to the node and > the > "[...]" then modifies that - makes sense. > > But then, shouldn't ".[.='software']" or "./.[.='software']" or
No, the syntax rules do not allow this:
>> [4] Step ::= AxisSpecifier NodeTest Predicate* >> | AbbreviatedStep
as we can see, Predicatecan only occur after a NodeTest , not after an AbbreviatedStep.
> "./[.='software']" work.
Again, Predicate cannot be the leftmost symbol in a step
> > In the case of ".[.='software']" isn't that saying start with the node > "." > (which exists) and then return all where .='software'?
This may seem a clear semantics, but the syntax is invalid according to the XPath 1.0 grammar rules.
As I said, use:
self::node()[.='software'] Cheers, Dimitre Novatchev
> > -- > thanks - dave > david_at_windward_dot_net > http://www.windwardreports.com > > > > "Dimitre Novatchev" wrote: > >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> news:24**********************************@microsof t.com... >> > Hello; >> > >> > I assumed it is invalid syntax. My question is why? I don't >> > understand >> > why >> > "[.='software']" or some variation of that is invalid. >> >> Read the XPath 1.0 Spec. >> >> It says: >> >> http://www.w3.org/TR/xpath#predicates >> >> "A predicate filters a node-set with respect to an axis to produce a >> new >> node-set. For each node in the node-set to be filtered, the >> PredicateExpr >> is >> evaluated with that node as the context node, with the number of nodes >> in >> the node-set as the context size, and with the proximity position of >> the >> node in the node-set with respect to the axis as the context position; >> if >> PredicateExpr evaluates to true for that node, the node is included in >> the >> new node-set; otherwise, it is not included." >> >> >> >> So, a predicate can only apear after some XPath expression and filters >> it. A >> predicate, alone, is not a valid XPath expression. >> >> This is also made clear if we look at the BNF grammar definition of >> XPath >> 1.0. Of all rules only rule [4] and rule [20] contain the nonterminal >> symbol >> predicate and it is always not the leading symbol (of the RHS): >> >> >> >> http://www.w3.org/TR/xpath#section-Location-Steps >> >> >> [4] Step ::= AxisSpecifier NodeTest Predicate* >> | AbbreviatedStep >> >> >> >> >> http://www.w3.org/TR/xpath#node-sets >> >> >> >> [20] FilterExpr ::= PrimaryExpr >> | FilterExpr Predicate >> >> >> >> >> I hope that this answers completely your question. >> >> >> Cheers, >> Dimitre Novatchev >> >> >> >> > >> > -- >> > thanks - dave >> > david_at_windward_dot_net >> > http://www.windwardreports.com >> > >> > >> > >> > "Dimitre Novatchev" wrote: >> > >> >> > // these all fail - WHY? >> >> >> >> because of a common feature -- they all have invalid XPath syntax. >> >> >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("./[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("./[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > >> >> > // yes this works - but I need the node as it does have a value. >> >> > object obj = nav.Evaluate(".='software'"); >> >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> >> >> >> >> Try: >> >> >> >> "self::*[.='software']" >> >> >> >> or >> >> >> >> "string(self::*[.='software'])" >> >> >> >> depending on whether you need the node or its string value >> >> returned. >> >> >> >> >> >> Cheers, >> >> Dimitre Novatchev >> >> >> >> >> >> >> >> >> >> >> >> "David Thielen" <da***@bogus.windward.net> wrote in message >> >> news:74**********************************@microsof t.com... >> >> > Hi; >> >> > >> >> > I am sure I am missing something here but I cannot figure it out. >> >> > Below >> >> > I >> >> > have a program and I cannot figure out why the xpath selects that >> >> > throw >> >> > an >> >> > exception fail. From what I know they should work. >> >> > >> >> > Also the second nav.OuterXml appears to also be wrong to me. >> >> > >> >> > Can someone explain to me why this does not work? (This is an >> >> > example >> >> > from >> >> > a >> >> > program we have where xpath can be entered in two parts so we >> >> > have >> >> > to >> >> > be >> >> > able >> >> > to handle this. We can't just always require the fill >> >> > /order/product[.='software'].) >> >> > >> >> > Program below sig. >> >> > >> >> > -- >> >> > thanks - dave >> >> > david_at_windward_dot_net >> >> > http://www.windwardreports.com >> >> > >> >> > Program.cs: >> >> > using System.Xml; >> >> > using System.Xml.XPath; >> >> > using System; >> >> > using System.IO; >> >> > >> >> > namespace XPathSample >> >> > { >> >> > class Program >> >> > { >> >> > static void Main(string[] args) >> >> > { >> >> > >> >> > string xml = >> >> > "<order>" + >> >> > "<product>software</product>" + >> >> > "<product>software</product>" + >> >> > "</order>"; >> >> > XPathDocument doc = new XPathDocument(new StringReader(xml)); >> >> > >> >> > // this works >> >> > XPathNavigator nav = doc.CreateNavigator(); >> >> > XPathNavigator rtn = >> >> > nav.SelectSingleNode("/order/product[.='software']"); >> >> > Console.Out.WriteLine("nav(/) = " + nav.OuterXml); >> >> > Console.Out.WriteLine("/order/product[.='software'] = " + >> >> > rtn.OuterXml); >> >> > >> >> > // this works although the nav.OuterXml appears wrong >> >> > nav = nav.SelectSingleNode("/order"); >> >> > rtn = nav.SelectSingleNode("product[.='software']"); >> >> > Console.Out.WriteLine("nav(/order) = " + nav.OuterXml); >> >> > Console.Out.WriteLine("product[.='software'] = " + rtn.OuterXml); >> >> > >> >> > // this works (same as prev) >> >> > rtn = nav.SelectSingleNode("./product[.='software']"); >> >> > Console.Out.WriteLine("./product[.='software'] = " + >> >> > rtn.OuterXml); >> >> > >> >> > nav = nav.SelectSingleNode("product"); >> >> > Console.Out.WriteLine("nav(/order/product) = " + nav.OuterXml); >> >> > >> >> > // these all fail - WHY? >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > try >> >> > { >> >> > rtn = nav.SelectSingleNode("./[.='software']"); >> >> > } >> >> > catch (XPathException ex) >> >> > { >> >> > Console.Out.WriteLine("./[.='software'] exception = " + >> >> > ex.Message); >> >> > } >> >> > >> >> > // yes this works - but I need the node as it does have a value. >> >> > object obj = nav.Evaluate(".='software'"); >> >> > Console.Out.WriteLine(".='software' evaluate = " + obj); >> >> > >> >> > >> >> > Console.Out.WriteLine("all done"); >> >> > } >> >> > } >> >> > } >> >> > >> >> > >> >> >> >> >> >> >> >> >> >>
This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Dave Murray |
last post by:
New to Python question, why does this fail?
Thanks,
Dave
---testcase.py---
import sys, urllib, htmllib
def Checkit(URL):
try:
print "Opening", URL
|
by: Curantil |
last post by:
When I look at all the examples every selection like
select="child::item" has a constant value to test against ("3" in
this case).
Can't this be done with a variable? eg:
select="child::item"
...
|
by: Keith Davies |
last post by:
Hi All,
I've got a document containing a internal lookups (I want to show a
relationship hierarchy, starting at an arbitrary point, or series of
points).
It's easy if I know what item IDs I...
|
by: gimme_this_gimme_that |
last post by:
I once downloaded a shareware program that allowed you
to open an xml file, click on a text or an attribute,
an then see the xpath expression that would fetch
that data.
The program didn't...
|
by: David Thielen |
last post by:
XPathNavigator nav = MyCreateNav(); // InnerXml == "software"
nav.SelectSingleNode".");
The select returns an exception:
+ $exception {"'.' has an invalid token."} System.Exception...
|
by: marfi95 |
last post by:
I'm just starting to learn xpath, so if I have the following xml
<Root>
<Data 1>
<Child 1></Child 1>
<Child 2></Child 2>
</Data 1>
<Data 2>
<Child 1></Child 1>
<Child 2></Child 2>
|
by: J.Marsch |
last post by:
I must be completely losing my mind.
I have some code that writes to config files. It works great with
app.config files, but fails miserably with web.config files. For the life
of me, I cannot...
|
by: Mikhail Teterin |
last post by:
Hello!
What's would be the syntax for a query, which would allow me to get only the
elements with non-empty text-nodes?
For example, from:
<a><b></b></a>
<c/>
<d><e>meow</e></d>
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: jfyes |
last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
|
by: ArrayDB |
last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
|
by: CloudSolutions |
last post by:
Introduction:
For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
|
by: Shællîpôpï 09 |
last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
|
by: af34tf |
last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
|
by: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
| |