Maxqueue
Maxqueue

Reputation: 2454

XMLNodeList Weird Behavior

Take the following XML as example:

<root>
  <lines>
    <line>
      <number>1</number>
    </line>
    <line>
      <number>2</number>
    </line>
  </lines>
</root>

XmlNodeList nodeList = doc.SelectNodes("//lines/line");
foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("//number");
}

The above code will result in index = 1 for both iterations.

foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("number");
}

The above code will result in 1,2 respectively. I know that // finds first occurrence of xpath but i feel like the first occurrence should be relative to the node itself. The behavior appears to find first occurrence from the root even when selecting nodes from a child node. Is this the way microsoft intended this to work or is this a bug.

Upvotes: 0

Views: 64

Answers (1)

Mathias M&#252;ller
Mathias M&#252;ller

Reputation: 22617

yeah thanks but just removing the slashes worked as well as in my second example.

Removing the slashes only works because number is an immediate child element of line. If it were further down in the hierarchy:

<root>
  <lines>
    <line>
      <other>
        <number>1</number>
      </other>
    </line>
  </lines>
</root>

you would still need to use .//number.

I just think it is confusing that if you are searching for node within a node that // would go back to the whole document.

That's just how XPath syntax is designed. // at the beginning of an XPath expression means that the evaluation context is the document node - the outermost node of an XML document. .// means that the context of the path expression is the current context node.

If you think about it, it is actually useful to have a way to select from the whole document in any context.

Is this the way microsoft intended this to work or is this a bug.

Microsoft is implementing the XPath standard, and yes, this is how the W3C intended an XPath library to work and it's not a bug.

Upvotes: 2

Related Questions