从CSPROJ文件中读取参考列表
题
有人知道一种方法可以编程读取VS2008 CSPROJ文件中的参考列表吗? MSBUILD似乎不支持此功能。我正在尝试通过将CSPROJ文件加载到XMLDOcument中来读取节点,但是,XPATH搜索不会返回任何节点。我正在使用以下代码:
System.Xml.XmlDocument projDefinition = new System.Xml.XmlDocument();
projDefinition.Load(fullProjectPath);
System.Xml.XPath.XPathNavigator navigator = projDefinition.CreateNavigator();
System.Xml.XPath.XPathNodeIterator iterator = navigator.Select(@"/Project/ItemGroup");
while (iterator.MoveNext())
{
Console.WriteLine(iterator.Current.Name);
}
如果我可以获取项目组列表,则可以确定是否包含参考信息。
解决方案
XPath应该是 /Project/ItemGroup/Reference
, ,您已经忘记了名称空间。我只使用xlinq-处理名称空间 XPathNavigator
相当凌乱。所以:
XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(fullProjectPath);
IEnumerable<string> references = projDefinition
.Element(msbuild + "Project")
.Elements(msbuild + "ItemGroup")
.Elements(msbuild + "Reference")
.Select(refElem => refElem.Value);
foreach (string reference in references)
{
Console.WriteLine(reference);
}
其他提示
在@pavel Minaev的答案上,这对我有用(请注意,添加的.Attributes行以阅读include属性)
XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(@"D:\SomeProject.csproj");
IEnumerable<string> references = projDefinition
.Element(msbuild + "Project")
.Elements(msbuild + "ItemGroup")
.Elements(msbuild + "Reference")
.Attributes("Include") // This is where the reference is mentioned
.Select(refElem => refElem.Value);
foreach (string reference in references)
{
Console.WriteLine(reference);
}
基于 @pavelminaev的答案,我还将“ HintPath”元素添加到输出中。我将字符串数组“引用”写入“ .txt”文件。
XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(@"C:\DynamicsFieldsSite.csproj");
var references = projDefinition
.Element(msbuild + "Project")
.Elements(msbuild + "ItemGroup")
.Elements(msbuild + "Reference")
.Select(refElem => (refElem.Attribute("Include") == null ? "" : refElem.Attribute("Include").Value) + "\n" + (refElem.Element(msbuild + "HintPath") == null ? "" : refElem.Element(msbuild + "HintPath").Value) + "\n");
File.WriteAllLines(@"C:\References.txt", references);
不隶属于 StackOverflow