2012-01-26 2 views
0

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

данных на уровне корня является недействительным, линия 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; 
    } 
} 

}


EDIT 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> 
+5

Полезный фрагмент вашего XML-файла (включая заголовок). – ChrisF

+0

Очень хорошо видно, поскольку сообщение об ошибке говорит, что оно не было хорошо сформировано xml. –

ответ

0

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

WebClient client = new WebClient(); 
client.DownloadStringAsync(new Uri(DETAILS)); 
client.DownloadStringCompleted += OnDownloadComplete; 
1

Прежде всего, с XmlReader reader = XmlReader.Create(new StringReader(DETAILS)) вы только получите свой адрес назад с тех пор 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

Будет ли синхронный вызов XDocument.Load вызвать у вас проблемы? В любом случае +1 для тонкого примера LINQ to XML. –

1

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

Осмотрите свои строковые данные (данные), содержащие XML-документ, с данными [0] ", если вывод является чем-то иным, чем" < ", тогда есть PreAmble.

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

Encoding.UTF8.GetPreAmble() 

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

Смежные вопросы