What is context node?

N

nicholas

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.Text, 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>
 
J

Jon Skeet [C# MVP]

nicholas said:
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.Element,
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
 
N

nicholas

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!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top