我正在尝试在XDocument对象中使用LINQ to XML。您如何查询下面示例中的结果元素?
<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;
答案 0 :(得分:40)
serv
是名称空间前缀。它必须与一些标识命名空间的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 :(得分:6)
冒号意味着XML正在使用namespaces。基于此blogpost发布有关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;