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>

XML读取器错误

首先,使用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;