2015-04-01 82 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中挑选编码来做类似的事情。

相关问题