当元素名称中有冒号时,如何使用LINQ查询XDocument?

23

我正在尝试在 XDocument 对象中使用 LINQ to XML。如何查询下面示例中的 result 元素?

<serv:header>
   <serv:response>
      <serv:result>SUCCESS</serv:result>
      <serv:gsbStatus>PRIMARY</serv:gsbStatus>
   </serv:response>
</serv:header>

当我使用这样的语句时,出现了异常:“额外信息:字符‘:’ ,十六进制值0x3A,不能包含在名称中。”

XDocument doc = XDocument.Parse(xml);
string value = doc.Descendants("serv:header").First().Descendants("serv:response").First().Descendants("serv:result").First().Value;
2个回答

45

serv 在你的 XML 中是一个命名空间前缀。它必须与一些标识该命名空间的 URI 相关联。在你的 XML 中查找类似这样的属性:

xmlns:serv="..."

引号内的值将成为命名空间。现在,在您的C#代码中,您可以使用该URI创建一个XNamespace对象:

private static readonly XNamespace serv = "...";

然后你可以在查询中像这样使用它:

string value = doc
    .Descendants(serv + "header").First()
    .Descendants(serv + "response").First()
    .Descendants(serv + "result").First()
    .Value;

顺便提一下,你应该考虑使用.Element()而不是.Descendants().First()


1
我能够使用 doc.Root.GetNamespaceOfPrefix("serv") - Luke Duddridge
通过简化我的实现,我能够在目标方法中创建一个更简单的变量:XNamespace xd = @"http://..."; - midoriha_senpai

6

冒号表示XML正在使用命名空间。根据这篇关于LINQ、XML和命名空间的博客文章,这是您可能想尝试的代码版本。

static XName serv(string name)
{
  return XNamespace.Get("<THE_NAMESPACE_URL>") + name;
}

XDocument doc = XDocument.Parse(xml);
string value = doc.Descendants(serv("header")).First().Descendants(serv("response")).First().Descendants(serv("result")).First().Value;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接