2012-04-16 2 views
0

は、関連する(C#の.NET)のコード:があるのはなぜWebサービスの応答XMLにエスケープ文字が含まれていて、その処理方法を教えてください。ここ

"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<responseblock version=\"3.67\">\n <requestreference>X3909254</requestreference>\n <response type=\"ERROR\">\n <timestamp>2012-04-16 13:53:59</timestamp>\n <error>\n  <message>Invalid field</message>\n  <code>30000</code>\n  <data>baseamount</data>\n </error>\n </response>\n</responseblock>\n" 

WebRequest webRequest = System.Net.WebRequest.Create(authenticationUrl); 

UTF8Encoding encoding = new UTF8Encoding(); 

... 

var webResponse = webRequest.GetResponse(); 
var webResponseLength = webResponse.ContentLength; 
byte[] responseBytes = new byte[webResponseLength]; 

webResponse.GetResponseStream().Read(responseBytes, 0, (int)webResponseLength); 
var responseText = encoding.GetString(responseBytes); 
webResponse.Close(); 

はここresponseTextの値が(上記のコードをデバッグ中のVisual Studioからコピーされたとして)次のようになります。一見エスケープ文字(例えば\")のレスポンスで?これは、レスポンスストリームを文字列に変換する方法によるものですか?代わりに何をすべきですか(変数responseTextに格納されている値を '標準' XMLとして解析できるように)

UPDATE - 私が使っていたいくつかのより多くのコード:

var resultXML = XElement.Parse(responseText); 

... 


int errorCode = (int)(resultXML.Element("error").Element("code")); 

問題は要素errorは、errorを参照するので、私の明白な無力resultXMLのルート要素の直接の子ではないということでした(または子要素code)。

答えて

2

これらの文字は、デバッグ中のみ表示されます。私はその目的は、文字列全体をコピーして、それを直接C#コードに挿入してさらにテストできることです。また、文字列全体を1行で表すことができます。

コード内の文字列にアクセスすると、\nはすべて実際の改行に変換されます。だからあなたはそれを安全に解析することができます。

P.S.なぜ手動でWebリクエストを呼び出すのですか?ソリューションツリーで[Web参照の追加]機能を使用すると、Visual Studioによってスタブコードが生成されます。次に、XMLを気にする必要はありません。オブジェクトを使って作業します。Visual Studioは、WSDLの記述に基づいて生成します。

+0

あなたは正しいです!私の問題は、それ自体が関連するルート要素の直接の子ではなかった要素に直接アクセスしようとしていたことが判明しました。 P.S. - 私はまだウェブサービスについて幾分学んでいます。そして、私はいつも、もっと "原始的な"構造で作業するほうが好きです。しかし、Visual StudioでWeb参照を使用していることを思い出してくれてありがとう。私は以前にそれらを使用しており、彼らは非常に便利です! –

+1

実際、Visual Studio 2008以降を実行している場合は、「Web参照の追加」ではなく「サービス参照の追加」を使用する必要があります。 –

関連する問題