从xml中的单个元素中提取值

时间:2018-05-22 08:51:48

标签: c# xml xml-parsing

我正在使用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")
            });

1 个答案:

答案 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");

请注意使用+运算符从XNameXNamespace创建string

(看起来您可能希望将duration转换为int而不是string,以便以语义上有用的形式获取值。)