2012-02-25 12 views
3

httpwebrequestを使用してxmlドキュメントを取得していますが、そのコードは次のとおりです。私はそれが正常に動作しますWindows PhoneでHttpWebRequestを使ってxmlを取得する

HttpGetMethod http = new HttpGetMethod(); 
http.Request("http://sample.com/xml.php"); 

を呼び出すと、私は、XML文書を解析する

XDocument document = XDocument.Parse(xml); 

       XElement element = document.Element("statuses"); 
       IEnumerable<XElement> statusesElements = element.Elements("status"); 

       foreach (var elx in statusesElements) 
       {} 

を使用しています。しかし、時には例外が発生することがあります。次に、返されたxml文字列に "e48"が含まれていることがわかりました(返されたxml文字列を見つけるためにFiddlerを使用しています)。しかし、私はその理由を理解することができません、それはとても奇妙です、 "e48"は何ですか?誰も助けてくれますか?

ありがとうございました。

enter image description here

public class HttpGetMethod 
    { 
     public WebCallBack CallBack; 

     public void Request(string url) 
     { 
      var request = (HttpWebRequest)HttpWebRequest.Create(url); 
      IAsyncResult result = null; 

      result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request); 
     } 

     private void ResponseCallback(IAsyncResult result) 
     { 
      try 
      { 
       var request = (HttpWebRequest)result.AsyncState; 
       var response = request.EndGetResponse(result); 

       using (var stream = response.GetResponseStream()) 
       { 
        using (var reader = new StreamReader(stream)) 
        { 

         if (CallBack != null) 
         { 
          var str = reader.ReadToEnd(); 
          CallBack(str); 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(delegate 
       { 
        CallBack(ex.ToString()); 
       }); 
      } 
     } 
    } 

デバッグ出力は次のようになります。ここでは

A first chance exception of type 'System.Xml.XmlException' occurred in System.Xml.dll 
A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll 
System.Xml.XmlException: '', hexadecimal value 0x0C, is an invalid character. Line 897, position 14. 
    at System.Xml.XmlTextReaderImpl.Throw(Exception e) 
    at System.Xml.XmlTextReaderImpl.Throw(Int32 res, String resString, String[] args) 
    at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, Int32 res, String resString, String[] args) 
    at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Char[] data, Int32 length, Int32 invCharPos) 
    at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32& outStartPos, Int32& outEndPos) 
    at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type) 
    at System.Xml.XmlTextReaderImpl.ParseCData() 
    at System.Xml.XmlTextReaderImpl.Parse 

はフィドルIH生の応答です:

など、この特定のシナリオの使用正規表現でIMO

enter image description here

+0

さらに奇妙だ事は、あなたが印刷例外トレースは、無効な文字が位置14で、私は例外を期待しているだろう、ライン897上であることを示しているということですe48文字が問題であった場合、無効な文字がデータの先頭にあることを示すメッセージが表示されます。 –

+0

Fiddlerの生のレスポンスに表示される場合、ファイルを生成するサーバーコードにバグがあります。あなたはそれをデバッグする必要があります。 –

+0

サーバーにアクセスできない場合は、条件付きでサーバーを削除するなど、サーバーの問題のように見えます。 – ameer

答えて

0

"^ [^ <] *" 0

String result = Regex.Replace(htmlDocument, @"^[^<]*", System.String.Empty, RegexOptions.Singleline); 
は先行ガベージ文字を削除するには

+0

public static string CleanInvalidXmlChars(文字列テキスト) { return System.Text.RegularExpressions.Regex.Replace(テキスト、@ "[^ <] *"、string.Empty); }しかし、それでも例外が発生します。 :-( – ellic

+1

これらはガベージ文字ではなく、応答の最初のチャンクの長さを指定します。 – simonc

+0

@imoncありがとう、simonc。あなたはそうです、チャンクの応答に対処する方法を見つけました。ロット。 – ellic

関連する問題