XML阅读器错误

时间:2012-01-26 22:02:19

标签: c# wpf xml silverlight

我正在重用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>

3 个答案:

答案 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;