从WCF服务SOAP响应的XML元素中提取单个值的方法咨询
解决WCF SOAP响应中提取单个元素值的问题
嘿,我看你卡在从WCF返回的SOAP响应里提取单个元素值的问题上了——核心原因其实是XML命名空间没处理对!你看到的<a:Duration>里的a:不是随便加的前缀,它对应着一个具体的命名空间,直接用元素名称查找会忽略这个前缀,所以才找不到目标值。
先搞清楚命名空间
先把a:前缀对应的命名空间存成变量,后续查找元素都要用到它:
XNamespace aNs = "http://schemas.datacontract.org/2004/07/LocalWcf";
方案一:从已有的ResultsView列表提取
你已经拿到了ResultsView列表,现在只要给元素名称加上命名空间,就能精准定位到子元素了:
假设你的ResultsView里只有一个元素(从示例SOAP响应看是这样),可以直接取第一个元素然后提取值:
// 先拿到第一个ResultsView元素 var firstResult = ResultsView.FirstOrDefault(); if (firstResult != null) { // 提取各个元素的值 string duration = (string)firstResult.Element(aNs + "Duration"); int metres = (int)firstResult.Element(aNs + "Metres"); string status = (string)firstResult.Element(aNs + "Status"); // 这里就可以用这些值做后续处理啦 Console.WriteLine($"时长:{duration},距离:{metres},状态:{status}"); }
如果有多个ResultsView元素,用Linq投影批量处理也很方便:
var parsedResults = ResultsView.Select(view => new { Duration = (string)view.Element(aNs + "Duration"), Metres = (int)view.Element(aNs + "Metres"), Status = (string)view.Element(aNs + "Status") }).ToList(); // 遍历处理每一条结果 foreach (var result in parsedResults) { // 做你需要的操作 }
方案二:直接从XDocument一步到位提取
如果你不需要单独保存ResultsView列表,也可以直接从整个XML文档里定位目标元素,省一步操作:
XDocument xDoc = XDocument.Parse(ServiceResult); XNamespace aNs = "http://schemas.datacontract.org/2004/07/LocalWcf"; // 直接提取Duration的值 string duration = (string)xDoc.Descendants(aNs + "ResultsView") .Elements(aNs + "Duration") .FirstOrDefault(); // 同理提取Metres和Status int metres = (int)xDoc.Descendants(aNs + "ResultsView") .Elements(aNs + "Metres") .FirstOrDefault(); string status = (string)xDoc.Descendants(aNs + "ResultsView") .Elements(aNs + "Status") .FirstOrDefault();
为什么你的原代码失败了?
你之前写的x.Element("Duration")没有指定命名空间,XML解析器会去寻找不带任何命名空间的<Duration>元素,但你的元素都是带a:前缀(对应上面的命名空间)的,自然找不到,所以返回的是空值或者无意义的字符串。只要加上命名空间,问题就解决啦!
内容的提问来源于stack exchange,提问作者joebohen
相关产品推荐
相关产品推荐

