473,320 Members | 1,930 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

Why does this xpath fail - starting over

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");
}
}
}
Feb 25 '06 #1
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");
}
}
}

Feb 26 '06 #2
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");
}
}
}


Feb 27 '06 #3

"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");
> }
> }
> }
>
>



Feb 27 '06 #4
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");
> }
> }
> }
>
>


Feb 27 '06 #5

"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");
>> > }
>> > }
>> > }
>> >
>> >
>>
>>
>>


Feb 27 '06 #6
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");
>> > }
>> > }
>> > }
>> >
>> >
>>
>>
>>


Feb 27 '06 #7

"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");
>> >> > }
>> >> > }
>> >> > }
>> >> >
>> >> >
>> >>
>> >>
>> >>
>>
>>
>>
>>


Feb 28 '06 #8
> 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");
>> >> > }
>> >> > }
>> >> > }
>> >> >
>> >> >
>> >>
>> >>
>> >>
>>
>>
>>
>>


Feb 28 '06 #9
> 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");
>> >> > }
>> >> > }
>> >> > }
>> >> >
>> >> >
>> >>
>> >>
>> >>
>>
>>
>>
>>



Feb 28 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

14
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
2
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" ...
1
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...
3
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...
13
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...
3
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>
6
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...
14
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>
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
1
isladogs
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...
0
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...
0
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...
0
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...
0
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...
0
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....
0
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
0
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...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.