15

I'm attempting to check for the existence of a node using the following .NET code:

xmlDocument.SelectSingleNode(
        String.Format("//ErrorTable/ProjectName/text()='{0}'", projectName));

This always raises:

XPathException: Expression must evaluate to a node-set.

Why am I getting this error and how can I resolve it? Thank you.

Wayne
  • 59,728
  • 15
  • 131
  • 126
Alex Angas
  • 59,219
  • 41
  • 137
  • 210

3 Answers3

19

The expression given evaluates to a boolean, not a node-set. I assume you want to check whether the ProjectName equals the parametrized text. In this case you need to write

//ErrorTable/ProjectName[text()='{0}']

This gives you a list of all nodes (a nodeset) matching the given condition. This list may be empty, in which case the C#-Expression in your sample will return null.

As an afterthought: You can use the original xpath expression, but not with SelectSingleNode, but with Evaluate, like this:

(bool)xmlDocument.CreateNavigator().Evaluate(String.Format("//ErrorTable/ProjectName/text()='{0}'", projectName));
TToni
  • 9,145
  • 1
  • 28
  • 42
1

Try:

Node node = xmlDocument.SelectSingleNode(String.Format("//ErrorTable/ProjectName = '{0}'", projectName));

if (node != null) {
    // and so on
}

Edit: silly error

rjohnston
  • 7,153
  • 8
  • 30
  • 37
1

The XPath expression contained a subtle error. It should have been:

xmlDocument.SelectSingleNode(String.Format("//ErrorTable/ProjectName[text()='{0}']", projectName));

The previous expression was evaluating to a boolean, which explains the exception error. Thanks for the help!

Alex Angas
  • 59,219
  • 41
  • 137
  • 210