Luke
Luke

Reputation: 1760

Null return on XmlDocument.SelectSingleNode through valid xpath (did try the old answer)

I've read the other question and apply the answer to my code, but it still doesn't work.
I use xml to read the csproj file to read/write something into it body. This is my csproject file if anyone care!
My code:

static void Main(string[] args)
{
    string file = @"D:\Project\svn_longnx\LearnSvnRevision\ConsoleApp1\WindowsFormsApp1\WindowsFormsApp1.csproj";
    XmlDocument xdoc = new XmlDocument();
    xdoc.Load(file);
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
    nsmgr.AddNamespace("default", "http://schemas.microsoft.com/developer/msbuild/2003");

    XmlElement root = xdoc.DocumentElement;

    XmlNode node = root.SelectSingleNode("Project/PropertyGroup/ApplicationVersion",nsmgr);

    Console.WriteLine(node.Value);
}

This dummy code failed either:

    static void Main(string[] args)
    {
        string file = @"D:\Project\svn_longnx\LearnSvnRevision\ConsoleApp1\WindowsFormsApp1\WindowsFormsApp1.csproj";
        XmlDocument xdoc = new XmlDocument();
        xdoc.Load(file);
        XmlElement root = xdoc.DocumentElement;
        XmlNode node = root.SelectSingleNode("Project/PropertyGroup/ApplicationVersion");
        Console.WriteLine(node.Value);
    }

Upvotes: 0

Views: 64

Answers (1)

DavidG
DavidG

Reputation: 119146

It's much easier to use XDocument and associated objects instead of the older XmlDocument bits. Also, you're probably falling down because of namespaces. Instead, try this code:

var doc = XDocument.Load(@"D:\Project\svn_longnx\Lear...\WindowsFormsApp1.csproj");
var ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");

var applicationVersionElements = doc.Element(ns + "Project")
    .Descendants(ns + "PropertyGroup")
    .Descendants(ns + "ApplicationVersion");

foreach (var element in applicationVersionElements)
{
    Console.WriteLine(element.Name);
}

This is just one way as an example of how to get that specific element to demonstrate how easy it is to use.

Note, you may need to add using System.Xml.Linq;

Upvotes: 1

Related Questions