Search code examples
c#xpathcsproj

XPath and *.csproj


I am for sure missing some important detail here. I just cannot make .NET's XPath work with Visual Studio project files.

Let's load an xml document:

var doc = new XmlDocument();
doc.Load("blah/blah.csproj");

Now execute my query:

var nodes = doc.SelectNodes("//ItemGroup");
Console.WriteLine(nodes.Count); // whoops, zero

Of course, there are nodes named ItemGroup in the file. Moreover, this query works:

var nodes = doc.SelectNodes("//*/@Include");
Console.WriteLine(nodes.Count); // found some

With other documents, XPath works just fine. I am absolutely puzzled about that. Could anyone explain me what is going on?


Solution

  • You probably need to add a reference to the namespace http://schemas.microsoft.com/developer/msbuild/2003.

    I had a similar problem, I wrote about it here. Do something like this:

    XmlDocument xdDoc = new XmlDocument();
    xdDoc.Load("blah/blah.csproj");
    
    XmlNamespaceManager xnManager =
     new XmlNamespaceManager(xdDoc.NameTable);
    xnManager.AddNamespace("tu",
     "http://schemas.microsoft.com/developer/msbuild/2003");
    
    XmlNode xnRoot = xdDoc.DocumentElement;
    XmlNodeList xnlPages = xnRoot.SelectNodes("//tu:ItemGroup", xnManager);