c# xpath csproj

c# - XPath y*.csproj



(3)

Mire el espacio de nombres raíz; Deberá incluir un administrador de espacio de nombre xml y utilizar consultas como "// x: ItemGroup", donde "x" es su alias designado para el espacio de nombres raíz. Y pasa el administrador a la consulta. Por ejemplo:

XmlDocument doc = new XmlDocument(); doc.Load("my.csproj"); XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); mgr.AddNamespace("foo", doc.DocumentElement.NamespaceURI); XmlNode firstCompile = doc.SelectSingleNode("//foo:Compile", mgr);

Estoy seguro de perder algunos detalles importantes aquí. Simplemente no puedo hacer que XPath de .NET funcione con archivos de proyecto de Visual Studio.

Carguemos un documento xml:

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

Ahora ejecuta mi consulta:

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

Por supuesto, hay nodos llamados ItemGroup en el archivo. Además, esta consulta funciona:

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

Con otros documentos, XPath funciona bien. Estoy absolutamente desconcertado acerca de eso. ¿Alguien podría explicarme qué está pasando?


Probablemente necesite agregar una referencia al espacio de nombres http://schemas.microsoft.com/developer/msbuild/2003 .

Tuve un problema similar, lo escribí aquí . Haz algo como esto:

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);


Publiqué una versión de LINQ / Xml en:

http://granadacoder.wordpress.com/2012/10/11/how-to-find-references-in-ac-project-file-csproj-using-linq-xml/

Pero aquí está la esencia de esto. Puede que no sea 100% perfecto ... pero muestra la idea.

Estoy publicando el código aquí, ya que encontré esta (publicación original) cuando busco una respuesta. Luego me cansé de buscar y escribí el mío.

string fileName = @"C:/MyFolder/MyProjectFile.csproj"; XDocument xDoc = XDocument.Load(fileName); XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003"); //References "By DLL (file)" var list1 = from list in xDoc.Descendants(ns + "ItemGroup") from item in list.Elements(ns + "Reference") /* where item.Element(ns + "HintPath") != null */ select new { CsProjFileName = fileName, ReferenceInclude = item.Attribute("Include").Value, RefType = (item.Element(ns + "HintPath") == null) ? "CompiledDLLInGac" : "CompiledDLL", HintPath = (item.Element(ns + "HintPath") == null) ? string.Empty : item.Element(ns + "HintPath").Value }; foreach (var v in list1) { Console.WriteLine(v.ToString()); } //References "By Project" var list2 = from list in xDoc.Descendants(ns + "ItemGroup") from item in list.Elements(ns + "ProjectReference") where item.Element(ns + "Project") != null select new { CsProjFileName = fileName, ReferenceInclude = item.Attribute("Include").Value, RefType = "ProjectReference", ProjectGuid = item.Element(ns + "Project").Value }; foreach (var v in list2) { Console.WriteLine(v.ToString()); }