我需要从VS项目文件中获取文件列表。 csproj文件是XML文件,所以我使用linq to xml来解析它。问题出在csproj文件的默认命名空间中,它声明为:
的xmlns = “http://schemas.microsoft.com/developer/msbuild/2003”
以下是我用来在csproj文件中查找“编译”元素的代码:
XmlReader reader = XmlReader.Create(projectFilePath);
XDocument doc = XDocument.Load(reader);
XmlNameTable nameTable = reader.NameTable;
XmlNamespaceManager nsManager = new XmlNamespaceManager(nameTable);
XNamespace nms = doc.Root.GetDefaultNamespace();
nsManager.AddNamespace("", nms.NamespaceName);
List<XElement> csFiles = new List<XElement>(doc.Root.XPathSelectElements("//Compile", nsManager));
doc.Root.XPathSelectElements
返回一个空列表。
nsManager.DefaultNamespace
的值为“http://schemas.microsoft.com/developer/msbuild/2003”。
但是nsManager.LookupNamespace("xmlns")
返回默认的XML命名空间:“http://www.w3.org/2000/xmlns/”。
如何更改xmlns命名空间值?
答案 0 :(得分:1)
您的问题是您需要使用XPath明确命名空间。它不仅仅使用文档的默认值,您必须为其命名。
如果你将最后两行改为这样的话,它会起作用(我选择了xmlns前缀“default”):
nsManager.AddNamespace("default", nms.NamespaceName);
List<XElement> csFiles = new List<XElement>(doc.Root.XPathSelectElements("//default:Compile", nsManager));
另一种选择是使用XContainer方法。这样您就不必担心使用命名空间管理器了:
XNamespace nms = doc.Root.GetDefaultNamespace();
List<XElement> csFiles = new List<XElement>(doc.Root.Descendants(nms + "Compile"));