【问题标题】:DataSet.ReadXml - Data at the root level is invalidDataSet.ReadXml - 根级别的数据无效
【发布时间】:2023-03-23 21:28:01
【问题描述】:

我正在尝试将来自 ASP.NET Web API 的 XML 响应读取到 DataSet 中,以便我可以将其绑定到 DropDownList。然而,在阅读回复时,我遇到了Data at the root level is invalid. Line 1, position 1.

截图:

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 字符的东西。什么可能引发错误?

【问题讨论】:

  • 听起来流的开头可能有一个字节顺序标记。
  • 该流不需要解码吗?使用什么字符编码?对于调试,您可以将其加载到字符串中并进行检查吗?
  • @dbc 如何验证字节顺序标记确实是问题所在?如果是,我需要在 API 级别还是在我的客户端代码中解决它?

标签: c# asp.net xml dataset


【解决方案1】:

听起来您可能使用了错误的编码。您可以尝试从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 中选择编码来执行类似操作。

【讨论】:

    【解决方案2】:

    试试:

    ReadXml(XmlReader)
    

    像这样:

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

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多