2013-04-24 2 views
0

я получаю своеобразный ответ назад от WebService:Синтаксический необычный XML с Linq

<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> 
    <GetLemonadeResponse xmlns="http://microsoft.com/webservices/"> 
     <GetLemonadeResult>&lt;Response&gt;&lt;Status&gt;Error&lt;/Status&gt;&lt;Message&gt;Could not find the Lemonade for this State/Lemon&lt;/Message&gt;&lt;FileNumber /&gt;&lt;/Response&gt;</GetLemonadeResult> 
    </GetLemonadeResponse> 
    </soap:Body> 
</soap:Envelope> 

2 вопроса:

1) Я не знаю, почему содержание GetLemonadeResult имеет отклоняющееся содержание (например, "& lt; ").

Я мигрируют байты строки таким образом:

WebClientEx client = new WebClientEx(); 
client.Headers.Add(HttpRequestHeader.ContentType, "text/xml; charset=utf-8"); 
client.Encoding = Encoding.UTF8; 
byte[] result = client.UploadData(_baseUri.ToString(), data); 
client.Encoding.GetBytes(xml)); 
string resultString = client.Encoding.GetString(result); 

(WebClientEx производный от WebClient с дополнительным свойством Timeout).

Я думаю, что если бы я выбрал неправильную кодировку, то внешняя часть ответа будет искажена одинаково.

У веб-службы есть ошибки?

2) Почему, когда я пытаюсь захватить «GetLemonadeResult», используя Linq to XML, он ничего не может вытащить?

var xdoc = XDocument.Parse(response); // returns the XML posted above 
var responseAsXML = xdoc.Descendants("GetLemonadeResult"); // gets nothing 

я бы не догадался, что я нужен пространство имен, чтобы поймать потомков, так как XML GetLemonadeResult тег не имеет Предварение «тег:».

+0

Я не вижу «GetClosingProtectionLetterResult» в вашем примере ответ? – cgatian

+0

'GetClosingProtectionLetterResult' не существует в примере XML, который вы предоставили. Обновите свой вопрос с помощью XML, который его содержит. –

+0

@cgtian: так много для маскировки, из какой отрасли я родом! Извинения ... – micahhoover

ответ

2

1) Некоторые символы, которые могут привести к потере XML как <,> и т.д. экранируются

2) Вы забыли включить пространства имен в коде

var xdoc = XDocument.Parse(response); 
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/"; 
XNamespace ns = "http://microsoft.com/webservices/"; 
var responseAsXML = xdoc.Descendants(soap + "Body") 
         .Descendants(ns + "GetLemonadeResult") 
         .First().Value; 

responseAsXML будет

<Response> 
<Status>Error</Status> 
<Message>Could not find the Lemonade for this State/Lemon 
</Message><FileNumber /> 
</Response> 

EDIT

Это мыло/XML я использовал для тестирования

string response = @"<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> 
         <GetLemonadeResponse xmlns=""http://microsoft.com/webservices/""> 
          <GetLemonadeResult>&lt;Response&gt;&lt;Status&gt;Error&lt;/Status&gt;&lt;Message&gt;Could not find the Lemonade for this State/Lemon&lt;/Message&gt;&lt;FileNumber /&gt;&lt;/Response&gt;</GetLemonadeResult> 
         </GetLemonadeResponse> 
         </soap:Body> 
        </soap:Envelope>"; 
+0

@micahhoover Я использовал мыло/xml в вашем вопросе, и он возвращает xml, который я разместил. Я отредактировал ответ. – I4V

+1

Спасибо. Я делал глупую ошибку в конце. Конверт не должен быть явно «нисходящим». – micahhoover

Смежные вопросы