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

7

这是我超级服务的一个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>

由于某些原因,当我尝试获取“Result”的后代或元素时,会得到null。这与命名空间有关吗?有人能提供检索此结果的解决方案吗?

5个回答

13

你可以尝试像这样:

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应该可以指导你朝正确的方向前进。


4

为了扩展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;
        }
    }

XDocument不包含“Parse”的定义。 - Carlos de Jesus Baez
System.Xml.Linq.XDocument.Parse确实存在于程序集:System.Xml.Linq,版本=4.0.0.0,文化=中性,公钥令牌=b77a5c561934e089。 - azpc

1
也许像这样:
IEnumerable<XElement> list = doc.Document.Descendants("Result");
if (list.Count() > 0)
{
    // do stuff
}

1
为什么你上面的例子中的list.Count()方法在我的电脑上不存在?我正在使用VS2010 .net 4。 - BeYourOwnGod

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

出现错误 - 无法在此范围内声明名为“e”的局部变量,因为它会赋予“e”不同的含义,而“e”已经在“父级或当前”范围内用于表示其他内容。该解决方案上出现了错误。我该如何解决? - Sagotharan

0

你可以试试这个。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接