2009-04-23 79 views
3

这里是我的SuperDuperService样本SOAP响应:使用C#和的XDocument /的XElement解析SOAP响应

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <MyResponse xmlns="http://mycrazyservice.com/SuperDuperService"> 
      <Result>32347</Result> 
     </MyResponse> 
    </soap:Body> 
</soap:Envelope> 

出于某种原因,当我试图抓住的“结果”的后代或元素,我得到空。它与名字空间有什么关系?有人可以提供一个解决方案来检索这个结果吗?

回答

10

你可能想尝试这样的事:

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。

1

也许是这样的:

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

出于某种原因,从例如list.Count()方法上面不会为我存在? Im使用VS2010 .net 4 – 2011-06-04 19:25:32

1

你在正确的方向搜索,它肯定有与命名空间做。

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

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"); 
+0

得到错误 - 名为'e'的局部变量不能在此范围内声明,因为它会给'e'赋予不同的含义,'e'已在'父'或'当前'范围内用于表示这个解决方案的其他错误。我该如何解决这个问题 – Sagotharan 2014-10-10 07:17:04

3

到与该excpects一个布尔值返回和响应与测试的代码扩展Justin的答案,并导致入手方法名(顺便说一句 - 一个惊喜甚至认为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; 
     } 
    }