在.NET中更改默认的XML xmlns命名空间值

时间:2011-08-03 08:28:42

标签: c# xml linq-to-xml xml-namespaces

我需要从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命名空间值?

1 个答案:

答案 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"));