471,618 Members | 1,062 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

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

What is context node?

Hi folks,

I'm diving into XPathNavigator.SelectDescendants method. There's a boolean
type parameter matchSelf, and MSDN says "To include the context node in the
selection, true; otherwise, false". But I don't understand how to use it.
The sample code in MSDN is below, but I didn't find any difference of the
result while setting the value of this parameter to true and false
inspectively. So could anybody show me how to use the parameter to get
different result?

Any reply is appreciated!
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();

XPathNodeIterator nodes = navigator.Select("/bookstore/book");
XPathNavigator nodesNavigator = nodes.Current;

XPathNodeIterator nodesText =
nodesNavigator.SelectDescendants(XPathNodeType.Tex t, false);

while (nodesText.MoveNext())
{
Console.Write(nodesText.Current.Name);
Console.WriteLine(nodesText.Current.Value);
}
<bookstore>
<book genre="autobiography" publicationdate="1981-03-22"
ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15"
ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
Dec 8 '05 #1
2 2302
nicholas wrote:
I'm diving into XPathNavigator.SelectDescendants method. There's a boolean
type parameter matchSelf, and MSDN says "To include the context node in the
selection, true; otherwise, false". But I don't understand how to use it.
The sample code in MSDN is below, but I didn't find any difference of the
result while setting the value of this parameter to true and false
inspectively. So could anybody show me how to use the parameter to get
different result?


The example is terrible, unfortunately. It doesn't actually move the
first iterator on, so it's actually selecting the descendants of the
top level node. Also, by using the text node type, it's not going to
show the difference between true and false, as the selected node will
never be a text node. Here's a modified version which shows the
difference:

using System;
using System.Xml;
using System.Xml.XPath;

class Test
{

static void Main()
{
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();

XPathNodeIterator nodes = navigator.Select("/bookstore/book");
nodes.MoveNext();
XPathNavigator nodesNavigator = nodes.Current;

XPathNodeIterator elements =
nodesNavigator.SelectDescendants(XPathNodeType.Ele ment,
false);

while (elements.MoveNext())
{
Console.WriteLine("Element name={0}",
elements.Current.Name);
}
}
}

This moves to the first node matching /bookstore/book, and then selects
all the element descendant nodes. As the second parameter is false, it
doesn't try to match the context node (the node you're searching for)
so the result doesn't include "Element name=book". If you change that
false to true, then it *does* include that.

Does that help?

Jon

Dec 8 '05 #2
Yes, that's really what I want to know. And I got the difference by
following your instruction.
Thanks very much for your kind-hearted help!

"Jon Skeet [C# MVP]" <sk***@pobox.com> wrote in message
news:11**********************@o13g2000cwo.googlegr oups.com...
nicholas wrote:
I'm diving into XPathNavigator.SelectDescendants method. There's a
boolean
type parameter matchSelf, and MSDN says "To include the context node in
the
selection, true; otherwise, false". But I don't understand how to use it.
The sample code in MSDN is below, but I didn't find any difference of the
result while setting the value of this parameter to true and false
inspectively. So could anybody show me how to use the parameter to get
different result?


The example is terrible, unfortunately. It doesn't actually move the
first iterator on, so it's actually selecting the descendants of the
top level node. Also, by using the text node type, it's not going to
show the difference between true and false, as the selected node will
never be a text node. Here's a modified version which shows the
difference:

using System;
using System.Xml;
using System.Xml.XPath;

class Test
{

static void Main()
{
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();

XPathNodeIterator nodes = navigator.Select("/bookstore/book");
nodes.MoveNext();
XPathNavigator nodesNavigator = nodes.Current;

XPathNodeIterator elements =
nodesNavigator.SelectDescendants(XPathNodeType.Ele ment,
false);

while (elements.MoveNext())
{
Console.WriteLine("Element name={0}",
elements.Current.Name);
}
}
}

This moves to the first node matching /bookstore/book, and then selects
all the element descendant nodes. As the second parameter is false, it
doesn't try to match the context node (the node you're searching for)
so the result doesn't include "Element name=book". If you change that
false to true, then it *does* include that.

Does that help?

Jon

Dec 9 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Vijay | last post: by
7 posts views Thread by Tim Hallwyl | last post: by
32 posts views Thread by Stephen Horne | last post: by
reply views Thread by leo001 | last post: by
1 post views Thread by ZEDKYRIE | last post: by

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.