使用XElement查询命名空间中的节点

时间:2011-01-31 23:07:45

标签: c# namespaces xelement

我正在尝试从csproj文件中提取一个看起来像这样的节点,但无法使其工作 - 可能是因为名称空间声明。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
      <PropertyGroup>
          <RegisterForComInterop>true</RegisterForComInterop>

这失败了:

XDocument cpo = XDocument.Load(file);
XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable());
nsm.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/200");
IEnumerable<XElement> list3 = cpo.XPathSelectElements("//x:RegisterForComInterop[.='true']", nsm);

有任何想法吗?

感谢。

1 个答案:

答案 0 :(得分:15)

你真的想要使用XPath吗?在LINQ to XML中使用名称空间非常简单:

XDocument cpo = XDocument.Load(file);
XNamespace x = "http://schemas.microsoft.com/developer/msbuild/2003";
var elements = cpo.Descendants(x + "RegisterForComInterop")
                  .Where(x => (string) x == "true");

或者如果你绝对相信每个RegisterForComInterop都有一个合适的布尔值,你可以使用explicit XElement to bool conversion

XDocument cpo = XDocument.Load(file);
XNamespace x = "http://schemas.microsoft.com/developer/msbuild/2003";
var elements = cpo.Descendants(x + "RegisterForComInterop")
                  .Where(x => (bool) x);

如果涉及名称空间,我个人通常会选择这条路线,而不是XPath ,尤其是