我正在使用wcf服务的soap响应,并希望从各个元素中提取值。到目前为止,我可以使用以下方法从soap信封中获取值列表:
XDocument xDoc = XDocument.Parse(ServiceResult);
List<XElement> ResultsView = xDoc.Descendants()
.Where(x => x.Name.LocalName == "ResultsView")
.ToList();
这给了我结果列表:
<a:ResultsView>
<a:Duration>4032</a:Duration>
<a:Metres>41124</a:Metres>
<a:Status>Ok</a:Status>
</a:ResultsView>
我无法通过查询ResultsView获得单个结果我可以在单个字符串中获取所有值,这是没用的。你能建议一种能获得价值的方法吗?
返回的完整肥皂信封是:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetLocalDataResponse xmlns="http://tempuri.org/">
<GetLocalDataResult xmlns:a="http://schemas.datacontract.org/2004/07/LocalWcf"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:ResultsView>
<a:Duration>4032</a:Duration>
<a:Metres>41124</a:Metres>
<a:Status>Ok</a:Status>
</a:ResultsView>
</GetLocalDataResult></GetLocalDataResponse></s:Body></s:Envelope>
我尝试了几种不同的方法来主要使用linq提取值:
var results = ResultsView.Select(x => new
{
ResultsView = (string)x.Element("Duration"),
duration = x.Element("Duration")
});
答案 0 :(得分:1)
问题在于您要求没有命名空间的元素。如果您使用正确的命名空间,则无需检查本地名称或类似名称:
XNamespace ns = "http://schemas.datacontract.org/2004/07/LoacalWcf";
XDocument doc = XDocument.Parse(ServiceResult);
XElement resultsView = doc.Descendants(ns + "ResultsView").Single();
XElement duration = resultsView.Element(ns + "Duration");
请注意使用+
运算符从XName
和XNamespace
创建string
。
(看起来您可能希望将duration
转换为int
而不是string
,以便以语义上有用的形式获取值。)