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:
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());
}