【问题标题】:using XElement to query for a node in namespace使用 XElement 查询命名空间中的节点
【发布时间】:2011-06-18 22:26:25
【问题描述】:

我正在尝试从一个看起来像这样的 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);

请问大家有什么想法吗?

谢谢。

【问题讨论】:

    标签: c# namespaces xelement


    【解决方案1】:

    您真的要为此使用 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尤其是

    【讨论】:

    • 我会用 .Where(x =&gt; bool.Parse(x.Value)) 替换最后一行,因为我们 100% 期待一个布尔字符串(否则我们期待和例外..)。
    • @Shimmy:我不会在这里使用 bool.Parse - 我会使用到知道 XML 的 bool 的显式转换。将编辑。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多