使用C#来解析SOAP响应 [英] Using C# to parse a SOAP Response

查看:429
本文介绍了使用C#来解析SOAP响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想获得的faultcode值,faultstring和ORDERNUMBER从SOAP下方

 < SOAP:信封的xmlns:SOAP =htt​​p://schemas.xmlsoap.org/soap/envelope/> 
< SOAP:身体与GT;
<&faultode的GT; 1234 LT; / faultode的>
< faultstring> SaveOrder:SetrsOrderMain:不能更改订购日期,如果GLPeriod被关闭,新的订购日期为3/2/2010:LN:1053< / faultstring>
<详情>
< SOAP:信封的xmlns:SOAP =htt​​p://schemas.xmlsoap.org/soap/envelope/>
< SOAP:身体UserGUID =测试>
< M:SaveOrder的xmlns:M =htt​​p://www.test.com/software/schema/UserGUID =测试>
<令ORDERNUMBER =1234-1234-123来电=OrderStatus =A的xmlns =htt​​p://www.test.com/software/schema/>

下面是我在C#



<$ P码$ p> 的XDocument DOC = XDocument.Load(HttpContext.Current.Server.MapPath(XMLexample.xml));

变种errorDetail =新EcourierErrorDetail
{
faultode的=从FC在doc.Descendants(faultode的)
选择fc.Value,
FaultString =从c.Descendants(faultstring)FS
邻在
doc.Descendants选择fs.Value,
ORDERNUMBER =(详细信息)。元素(订单)。属性(订单号码)
选择o.Value
};
返回errorDetail;



我能够得到的数值为的faultcode和faultstring但不是订单号码。我得到枚举没有结果。任何人都可以帮忙吗?谢谢


解决方案

是的,你选择时,忽略了XML命名空间:

 < SOAP:信封的xmlns:SOAP =htt​​p://schemas.xmlsoap.org/soap/envelope/> 
.....
< M:SaveOrder的xmlns:M =htt​​p://www.test.com/software/schema/UserGUID =测试>
<令ORDERNUMBER =1234-1234-123来电=OrderStatus =A的xmlns =htt​​p://www.test.com/software/schema/>



<排序> 标签里面在< M:; 前缀SaveOrder>,它使用了米前缀XML命名空间标记。



另外,你要选择详细信息,然后你跳到订单节点直接(使用 .Elements() ) - 你错过了< M:SaveOrder> 之间的节点



。你需要考虑到这一点进行选择时:

 的XDocument DOC = XDocument.Load(HttpContext.Current.Server.MapPath( XMLexample.xml)); 

的XNamespace的xmlns =htt​​p://www.test.com/software/schema/;

VAR orderNode = doc.Descendants号(xmlns +SaveOrder),元素符号(xmlns +订单)。

VAR值=邻在orderNode.Attributes(订单号码)
选择o.Value;



这是否给你一个结果??


I am trying to get the values for faultcode, faultstring, and OrderNumber from the SOAP below

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP:Body>
        <faultcode>1234</faultcode> 
        <faultstring>SaveOrder:SetrsOrderMain:Cannot change OrderDate if GLPeriod is closed, new OrderDate is 3/2/2010:Ln:1053</faultstring>               
        <detail>
           <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
           <SOAP:Body UserGUID="test">
           <m:SaveOrder xmlns:m="http://www.test.com/software/schema/" UserGUID="test">
                <Order OrderNumber="1234-1234-123" Caller="" OrderStatus="A" xmlns="http://www.test.com/software/schema/">

Here is my code in C#

XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath("XMLexample.xml"));

var errorDetail = new EcourierErrorDetail
{
   FaultCode = from fc in doc.Descendants("faultcode")
               select fc.Value,
   FaultString = from fs in c.Descendants("faultstring")
                 select fs.Value,
   OrderNumber = from o in    
                 doc.Descendants("detail").Elements("Order").Attributes("OrderNumber")
                 select o.Value
};
return errorDetail;

I am able to get the values for both faultcode and faultstring but not the OrderNumber. I am getting "Enumeration yielded no results." Can anyone help? Thanks.

解决方案

Yes, you're ignoring the XML namespace when selecting:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
   .....
   <m:SaveOrder xmlns:m="http://www.test.com/software/schema/" UserGUID="test">
     <Order OrderNumber="1234-1234-123" Caller="" OrderStatus="A" xmlns="http://www.test.com/software/schema/">

The <Order> tag is inside the <m:SaveOrder> tag which uses the XML namespace prefixed by the m: prefix.

Also, you're trying to select the "detail" and then you skip to the "Order" node directly (using .Elements()) - you missed the <m:SaveOrder> node in between.

You need to take that into account when selecting:

XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath("XMLexample.xml"));

XNamespace xmlns = "http://www.test.com/software/schema/";

var orderNode = doc.Descendants(xmlns + "SaveOrder").Elements(xmlns + "Order");

var value = from o in orderNode.Attributes("OrderNumber")
            select o.Value;

Does that give you a result??

这篇关于使用C#来解析SOAP响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆