2010-05-20 132 views
3

我试图获得的faultcode值,faultstring,和订单号码从SOAP下面使用C#来解析SOAP响应

<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/"> 

这是我在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; 

我能够获取faultcode和faultstring的值,而不是OrderNumber。我得到“枚举没有结果。”谁能帮忙?谢谢。

回答

6

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

<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/"> 

<Order>标签是使用由m:前缀为前缀的XML命名空间<m:SaveOrder>标签内。另外,您试图选择“详细信息”,然后直接跳到“订购”节点(使用.Elements()) - 您错过了其间的<m:SaveOrder>节点。

选择时,您需要考虑到这一点:

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; 

这是否给你一个结果?

+0

作品完美!谢谢。 – Gavin 2010-05-20 17:27:24