XML读取器错误
本文关键字:错误 读取 XML | 更新日期: 2023-09-27 18:21:47
我正在重用Windows窗体应用程序中使用的代码。我在这里找到了一些使用StringReader
类使代码无错误的帮助。当运行我的应用程序时,它是一个Windows Phone Silverlight应用程序,我收到一个异常,说
根级别的数据无效,第1行位置1
代码的目的是使用ISBN编号,在isbndb.com上搜索这本书,并发回书名、作者和描述。如有任何关于此错误的帮助,我们将不胜感激。该方法返回memberbook
对象中的项目"title"、"author"answers"description"。
public class ISBNDB
{
public string key = "??????????";
public string URL = "http://isbndb.com/api/books.xml?access_key=";
string DETAILS;
private MemberBook mb;
private string title;
private string author;
private string description;
public ISBNDB()
{
URL += key;
DETAILS += key;
title = null;
}
public ISBNDB(string key)
{
this.key = key;
URL += key;
DETAILS += key;
title = null;
}
public MemberBook GetData(string isbn)
{
DETAILS = URL;
DETAILS += "&results=texts&index1=isbn&value1=" + isbn;
using (XmlReader reader = XmlReader.Create(new StringReader(DETAILS)))
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
switch(reader.Name)
{
case "Title":title = reader.ReadContentAsString();
break;
case "AuthorsText": author = reader.ReadContentAsString();
break;
case "Summary": description = reader.ReadContentAsString();
if (description.Equals(""))
description = "Not Available";
if(description.Length > 2000)
description = "Not Available";
break;
}
break;
}
}
return mb;
}
}
}
编辑SampleXML(L.B)
<?xml version="1.0" encoding="UTF-8"?>
<ISBNdb server_time="2012-01-26T22:30:26Z">
<BookList total_results="1" page_size="10" page_number="1" shown_results="1">
<BookData book_id="jaws_a05" isbn="1400064562" isbn13="9781400064564">
<Title>Jaws</Title>
<TitleLong></TitleLong>
<AuthorsText>Peter Benchley, </AuthorsText>
<PublisherText publisher_id="random_house">Random House</PublisherText>
<Summary>"Relentless terror." The Philadelphia Inquirer.The classic, blockbuster thriller of man-eating terror that inspired the Steven Spielberg movie and made millions of beachgoers afraid to go into the water. Experience the thrill of helpless horror again -- or for the first time!From the Paperback edition.</Summary>
<Notes></Notes>
<UrlsText></UrlsText>
<AwardsText></AwardsText>
</BookData>
</BookList>
</ISBNdb>
首先,使用XmlReader reader = XmlReader.Create(new StringReader(DETAILS))
,由于StringReader从其输入中形成字符串,因此只能返回url。它不会下载url的内容。
你可以使用
var xdoc = XDocument.Load(DETAILS);
或
var xmlReader = XmlReader.Create(DETAILS);
XmlDocument xmlDoc = new System.Xml.XmlDocument();
xmlDoc.Load(xmlReader);
获取xml并解析为
xdoc.Descendants("Title").First().Value
以下是完整的示例代码:
var xdoc = XDocument.Load(DETAILS);
var info = xdoc
.Descendants("BookData")
.Select(n =>
new{
Title = n.Element("Title").Value,
AuthorsText = n.Element("AuthorsText").Value,
Summary = n.Element("Summary").Value,
}
).ToList();
XML文档的问题可能是在XML文档的开头有一个PreAmble。PreAmble定义以下内容使用的编码。无论是UTF-8、UTF-16还是其他什么。
检查包含带"data[0]"的XML文档的字符串数据(data)。如果输出不是"<",则存在PreAmble。
然后,您可以删除字符串的第一个字符,而第一个字符!='<'。如果你想看看一些不同的PreAmbles,请参阅:
Encoding.UTF8.GetPreAmble()
这将返回一个字节[],用于UTF8 FileContent的PreAmble。
您不希望在Silverlight中使用同步网络调用。相反,使用异步调用将XML作为字符串获取。然后在回调中,将其解析为XML。要异步获取字符串,请使用以下方法:
WebClient client = new WebClient();
client.DownloadStringAsync(new Uri(DETAILS));
client.DownloadStringCompleted += OnDownloadComplete;