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。
Apiemail 使用受信任的 IP。如果您的 IP 不可信,您会收到一条纯文本,说明您不允许,这会在第 1 行位置 1 上带来错误。因为这不是 xml。我们现在将该 IP 添加到受信任列表中并继续工作。
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());
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
因此它有助于确保您收到的是有效的 XML。