根级别的数据无效。读取 xml 时,第 1 行,位置 1。

问题描述 投票:0回答:4
当我尝试从第三方公司读取 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>
    
c# asp.net xml
4个回答
3
投票
我们(米德尔帕特和我)在同一家公司工作,并找出了它给出错误的原因。

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

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


1
投票
我尝试通过解析另一个 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());
    

0
投票
尝试使用“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.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx


0
投票
我在一个曾经运行良好的端点上看到了这个错误。当我深入研究收到的响应时,很明显 API 决定在我不注意的某个时刻开始返回 JSON。

因此它有助于确保您收到的是有效的 XML。

© www.soinside.com 2019 - 2024. All rights reserved.