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

时间:2009-04-23 01:35:52

标签: c# xml soap parsing

以下是来自SuperDuperService的示例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>

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

5 个答案:

答案 0 :(得分:11)

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

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 :(得分:4)

用测试代码扩展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;
        }
    }

答案 2 :(得分:1)

也许是这样的:

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

答案 3 :(得分: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");

答案 4 :(得分:0)

您可以尝试一下。

Regex regex = new Regex("<Result>(.*)</Result>");
                var v = regex.Match(yourResponse);
                string s = v.Groups[1].ToString();