Ошибка чтения XML - PullRequest
       0

Ошибка чтения XML

0 голосов
/ 27 января 2012

Я повторно использую код, используемый в приложении Windows Forms.Здесь я нашел некоторую помощь, чтобы освободить код от ошибок, используя класс StringReader.При запуске моего приложения, которое является приложением Windows Phone Silverlight, я получаю исключение:

Недопустимые данные на корневом уровне, строка 1, позиция 1

Целькода использовать номер ISBN, найти книгу на isbndb.com и отправить обратно название, автора и описание.Любая помощь по этой ошибке будет принята с благодарностью.Метод возвращает элементы "title", "author" и "description" в 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(LB)

<?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 ]

1 голос
/ 27 января 2012

Проблема с вашим XML-документом, вероятно, заключается в том, что в начале вашего XML-документа есть PreAmble.PreAmble определяет, какую кодировку использует следующий контент.Является ли это UTF-8 или UTF-16 или чем-то еще.

Проверьте ваши строковые данные (данные), которые содержат XML-документ, с помощью «data [0]», если вывод отличается от «<»затем есть PreAmble. </p>

Вы можете удалить первый символ строки, пока первый символ! = '<'.Если вы хотите взглянуть на некоторые другие Преамбулы, см .: </p>

Encoding.UTF8.GetPreAmble()

. Это вернет байт [], который используется для PreAmble файла UTF8 FileContent.

1 голос
/ 27 января 2012

Прежде всего, с XmlReader reader = XmlReader.Create(new StringReader(DETAILS)) вы получите только ваш URL, так как StringReader формирует строку из своего ввода.Он не загружает содержимое 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();
0 голосов
/ 27 января 2012

Вы не хотите использовать синхронные сетевые вызовы в Silverlight. Вместо этого используйте асинхронный вызов, чтобы получить XML в виде строки. Затем в обратном вызове проанализируйте его как XML. Чтобы получить строку асинхронно, используйте что-то вроде этого:

WebClient client = new WebClient();
client.DownloadStringAsync(new Uri(DETAILS));
client.DownloadStringCompleted += OnDownloadComplete;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...