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

Jim*_*Jim 20 linq linq-to-xml

我试图在XDocument对象中使用LINQ to XML.你如何在下面的例子中查询结果元素?

<serv:header>
   <serv:response>
      <serv:result>SUCCESS</serv:result>
      <serv:gsbStatus>PRIMARY</serv:gsbStatus>
   </serv:response>
</serv:header>
Run Code Online (Sandbox Code Playgroud)

当我使用这样的语句时,我得到异常'附加信息:''''字符,十六进制值0x3A,不能包含在名称中.

XDocument doc = XDocument.Parse(xml);
string value = doc.Descendants("serv:header").First().Descendants("serv:response").First().Descendants("serv:result").First().Value;
Run Code Online (Sandbox Code Playgroud)

Pav*_*aev 40

serv在您的XML中是名称空间前缀.它必须与一些标识命名空间的URI相关联.在XML中查找这样的属性:

xmlns:serv="..."
Run Code Online (Sandbox Code Playgroud)

引号内的值将是命名空间.现在,在您的C#代码中,您使用该URI来创建XNamespace对象:

private static readonly XNamespace serv = "...";
Run Code Online (Sandbox Code Playgroud)

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

string value = doc
    .Descendants(serv + "header").First()
    .Descendants(serv + "response").First()
    .Descendants(serv + "result").First()
    .Value;
Run Code Online (Sandbox Code Playgroud)

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


Edw*_*ale 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;
Run Code Online (Sandbox Code Playgroud)