Использование C # для анализа ответа SOAP - PullRequest
3 голосов
/ 20 мая 2010

Я пытаюсь получить значения для кода ошибки, строки ошибки и номера заказа из 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;

Я могу получить значения как кода ошибки, так и строки ошибок, но не OrderNumber. Я получаю «Перечень не дал результатов». Кто-нибудь может помочь? Спасибо.

1 Ответ

6 голосов
/ 20 мая 2010

Да, вы игнорируете пространство имен 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:SaveOrder>, который использует пространство имен XML с префиксом m:.

Кроме того, вы пытаетесь выбрать «деталь», а затем переходите непосредственно к узлу «Заказ» (используя .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;

Это дает вам результат ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...