使用C#和XDocument / XElement来解析Soap响应

以下是来自SuperDuperService的示例soap响应:

   32347    

出于某种原因,当我试图抓住“结果”的后代或元素时,我得到了空。 它与命名空间有关吗? 有人可以提供从中检索结果的解决方案吗?

您可能想尝试这样的事情:

 string myNamespace= "http://mycrazyservice.com/SuperDuperService"; var results = from result in yourXml.Descendants(XName.Get("MyResponse", myNamespace)) select result.Element("Result").value 

在这台笔记本电脑上没有VS,所以我不能仔细检查我的代码,但它应该使用LINQ to SQL指向正确的方向。

使用测试代码扩展Justin的答案,其中返回表示布尔值,并且响应和结果以方法名称开头(BTW – 甚至认为XML元素在解析时不显示它需要的NS):

  private string ParseXml(string sXml, string sNs, string sMethod, out bool br) { br = false; string sr = ""; try { XDocument xd = XDocument.Parse(sXml); if (xd.Root != null) { XNamespace xmlns = sNs; var results = from result in xd.Descendants(xmlns + sMethod + "Response") let xElement = result.Element(xmlns + sMethod + "Result") where xElement != null select xElement.Value; foreach (var item in results) sr = item; br = (sr.Equals("true")); return sr; } return "Invalid XML " + Environment.NewLine + sXml; } catch (Exception ex) { return "Invalid XML " + Environment.NewLine + ex.Message + Environment.NewLine + sXml; } } 

也许是这样的:

 IEnumerable list = doc.Document.Descendants("Result"); if (list.Count() > 0) { // do stuff } 

你正在寻找正确的方向,它肯定与命名空间有关。

下面的代码返回为命名空间和元素名称组合找到的第一个元素。

 XDocument doc = XDocument.Load(@"c:\temp\file.xml"); XNamespace ns = @"http://mycrazyservice.com/SuperDuperService"; XElement el = doc.Elements().DescendantsAndSelf().FirstOrDefault( e => e.Name == ns + "Result");