2009-10-28 92 views
20

我想在XDocument对象中使用LINQ to XML。你如何在下面的例子中查询结果元素?如何在元素名称中包含冒号的情况下使用LINQ查询XDocument?

<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; 

回答

38

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()

+0

我能够使用'doc.Root.GetNamespaceOfPrefix(“serv”)' – 2017-08-03 14:09:43

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; 
相关问题