【问题标题】:Data at the root level is invalid. Line 1, position 1. while reading xml根级别的数据无效。第 1 行,位置 1。在读取 xml 时
【发布时间】:2013-07-02 13:59:00
【问题描述】:

当我尝试从第三方公司读取 xml 文件时,我收到错误:

Data at the root level is invalid. Line 1, position 1.

我在 google 上读过这个问题可能是因为 xml 文档的数据是 utf-8 并且 String 只接受 utf-16。

但我找不到合适的解决方案。我从一个 url 读取了 xml 文件。

这是我写的代码:

private void GetBlockList(DateTime lastUpdate, string username, string password)
    {
        List<String> m_list = new List<String>();

        HttpWebRequest blockListRequest = (HttpWebRequest)WebRequest.Create(string.Format("https://www.apiemail.net/api.aspx?Username={0}&Password={1}&Function=get_blocklist&SID=4", username, password));
        HttpWebResponse blockListResponse = (HttpWebResponse)blockListRequest.GetResponse();

        XmlDocument blockListXmlDoc = new XmlDocument();

        XmlNode root = blockListXmlDoc.DocumentElement;

        XmlNodeList blockNodeList = root.SelectNodes("blockedemail");

        blockListXmlDoc.Load(blockListResponse.GetResponseStream());

        int count = 0;

        while (blockNodeList.Count < count)
        {
            m_list.Add(blockNodeList.Item(count).SelectSingleNode("address").InnerText);

            count++;
        }

        return m_list;
    }

前几行操作 xml:(注意这是一个相当大的 xml。)

<?xml version="1.0" encoding="ISO-8859-1"?>

<blockedemails>
    <blockedemail>
        <address>email</address>
        <date>6/4/2011 12:11:14 AM</date>
    </blockedemail>
    <blockedemail>
        <address>email</address>
        <date>6/6/2011 1:39:04 PM</date>
    </blockedemail>
    <blockedemail>
        <address>email</address>
        <date>4/23/2011 8:56:06 PM</date>
    </blockedemail>

【问题讨论】:

  • XML 的前几行会很有用。
  • 提议的 utf 问题不太可能。最有可能:xml 以空格开头...我们可以看到 xml 的开头吗? 包括任何空行?
  • 或者可能是 BOM?在十六进制编辑器中检查前三个字节。
  • 十六进制编辑器显示:00000000: 3C 3F 78 6D 6C 20 76 65 这看起来不像 BOM
  • 如果您直接从 URL 加载 XML 而不是通过 HttpWebRequest/Response 加载,您会得到同样的错误吗? (见msdn.microsoft.com/en-us/library/875kz807%28v=VS.100%29.aspx

标签: c# asp.net xml


【解决方案1】:

我们(middelpat 和我)在同一家公司工作,并找出了错误的原因。

我们将得到的响应写入一个文件并查看该文件。有一个错误消息而不是 xml。

Apiemail 使用受信任的 IP。如果你的 ip 不受信任,你会得到一个纯文本,说你不允许,这会在第 1 行位置 1 上带来错误。因为那不是 xml。我们现在将 ip 添加到受信任的列表中并继续工作。

【讨论】:

    【解决方案2】:

    我尝试通过解析来自另一个 XDocument 的字符串来加载 xml,但遇到了同样的错误。

    XDocument xDocData = XDocument.Parse(xDoc.Element("SecuredWebService").Element("data").Element("Approved").Value);
    

    原来这样做“.Value”会生成一个开头有空格的xml,这是我的错误的根源。我改用“.ToString()”解决了这个问题。

    XDocument xDocData = XDocument.Parse(xDoc.Element("SecuredWebService").Element("data").Element("Approved").ToString());
    

    【讨论】:

      【解决方案3】:

      尝试使用“System.Xml.Linq;”命名空间。

      HttpWebRequest blockListRequest = (HttpWebRequest)WebRequest.Create(string.Format("https://www.apiemail.net/api.aspx?Username={0}&Password={1}&Function=get_blocklist&SID=4", username, password));
      HttpWebResponse blockListResponse = (HttpWebResponse)blockListRequest.GetResponse();
      XDocument doc = new XDocument(blockListRequest);
      

      然后只需调用

      IEnumerable<XElement> elements = doc.Descendants("blockedemail");
      

      将返回“XElement”的集合,您可以使用它进行迭代。 有类似的方法

      foreach(var element in elements)
      {
         element.GetElement("address").Value;
      }
      

      这样做我在阅读 *.xml 文件时从来没有遇到任何问题。 以下是一些可能有用的教程的参考:

      http://www.techrepublic.com/blog/programming-and-development/access-xml-data-using-linq-to-xml/594 http://www.hookdonlinq.com/LINQtoXML5MinuteOverview.ashx

      【讨论】:

      • 供其他用户使用,此代码中修复了一些小错误:“Xdocument doc = new Xdocument(blockListRequest)”和element.Element(“address”).Value;
      • 是的,我的错误,抱歉马上修复我会尽快找到解决方案和反馈
      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 2018-10-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2018-03-30
      • 2013-07-21
      相关资源
      最近更新 更多