我正在重用Windows窗体应用程序中使用的代码。我在这里找到了一些帮助,使用StringReader
类来解决我的代码错误。运行我的应用程序(Windows Phone Silverlight应用程序)时,我收到一个例外
根级别的数据无效,第1行位置1
代码的目的是使用ISBN编号,搜索isbndb.com作为书籍并发回标题,作者和描述。任何有关此错误的帮助将不胜感激。该方法返回memberbook
对象中的“标题”,“作者”和“描述”项。
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>
答案 0 :(得分:1)
首先,使用XmlReader reader = XmlReader.Create(new StringReader(DETAILS))
,您将只返回您的网址,因为StringReader从其输入中形成一个字符串。它不会下载网址的内容。
您可以使用
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();
答案 1 :(得分:1)
XML-Document的问题可能是在XML文档的开头有一个PreAmble。 PreAmble定义以下内容正在使用的编码。无论是UTF-8还是UTF-16或其他。
如果输出不是“&lt;”,则检查包含带有“data [0]”的XML-Document的字符串数据(数据)然后有一个PreAmble。
然后你可以在第一个char!='&lt;'时删除字符串的第一个字符。 如果你想看看一些不同的PreAmbles,请看:
Encoding.UTF8.GetPreAmble()
这将返回一个byte [],用于UTF8 FileContent的PreAmble。
答案 2 :(得分:0)
您不希望在Silverlight中使用同步网络调用。相反,使用异步调用将XML作为字符串获取。然后在回调中,将其解析为XML。要异步获取字符串,请使用以下内容:
WebClient client = new WebClient();
client.DownloadStringAsync(new Uri(DETAILS));
client.DownloadStringCompleted += OnDownloadComplete;