2015-04-01 70 views
0

我試圖讀取從ASP.NET的Web API的XML響應到DataSet,這樣我可以把它綁定到一個DropDownList。然而,當讀取響應,我會見了Data at the root level is invalid. Line 1, position 1.DataSet.ReadXml - 在根級別的數據無效

Snipp:

WebRequest request = WebRequest.Create("EndPointURL"); 
request.Method = "GET"; 
WebResponse response = request.GetResponse(); 

DataSet ds = new DataSet(); 

using (StreamReader rdr = new StreamReader(response.GetResponseStream())) 
{ 
    ds.ReadXml(rdr); //EXCEPTION Data at the root level is invalid. Line 1, position 1. 
} 

XML響應的示例:

<ArrayOfPerson xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MySchema"> 
    <Person> 
     <Address1 xmlns="http://schemas.datacontract.org/2004/07/ClassSchema">123 Main Street</Address1> 
     <Address2 xmlns="http://schemas.datacontract.org/2004/07/ClassSchema"">None</Address2> 
     ...FOR BREVITY 
    </Person> 
    <Person> 
     ..FOR BREVITY 
    </Person> 
    . 
    . 
    . 
</ArrayOfPerson> 

我已經成功地使這個調用API的另一端點,以便我有點難住。我在Line 1, position 1看不到任何東西,看起來像一個無效的XML字符。什麼可能會拋出錯誤?

+1

聽起來像在流的開始處可能有一個字節順序標記。 – dbc 2015-04-01 20:02:54

+0

該流是否需要解碼?使用什麼字符編碼?對於調試,你可以將它加載到一個字符串中進行檢查嗎? – 2015-04-01 20:05:30

+0

@dbc如何驗證字節順序標記確實是問題?如果是這樣,我需要在API級別還是在我的客戶代碼中解決它? – KidBatman 2015-04-01 20:53:33

回答

0

嘗試:

ReadXml(XmlReader) 

像這樣:

XmlTextReader reader = new XmlTextReader(rdr); 
ds.ReadXml(reader); 
+0

不幸的是,我仍然收到相同的錯誤:( – KidBatman 2015-04-01 20:52:19

0

聽起來你可能使用了錯誤的編碼。你可以嘗試從HttpWebResponse設置編碼:

 var ds = new DataSet(); 

     WebRequest request = WebRequest.Create(requestUriString); 
     request.Method = "GET"; 
     using (var response = (System.Net.HttpWebResponse)request.GetResponse()) 
     { 
      // get correct charset and encoding from the server's header 
      Encoding encoding; 
      try 
      { 
       encoding = Encoding.GetEncoding(response.CharacterSet); 
      } 
      catch 
      { 
       encoding = Encoding.UTF8; 
      } 

      using (var rdr = new StreamReader(response.GetResponseStream(), encoding)) 
      { 
       ds.ReadXml(rdr); 
      } 
     } 

注意這是在這裏複雜的答案的簡化版本:Encoding problem with HttpWebResponse。這些答案建議從返回的HTML中選擇實際的編碼,並在需要時重新加載流。如果您確實需要這樣做,您可以嘗試從XML declaration中挑選編碼來做類似的事情。

相關問題