Чтение узлов XML из веб-сервиса - PullRequest
2 голосов
/ 10 декабря 2011

Я играл с простым приложением для Windows Phone 7, используя веб-сервисы через http с ответами XML. Я использую следующий API http://api.chartlyrics.com/apiv1.asmx/

У меня проблемы с чтением возвращенного XML.

Функция SearchLyricDirect, например http://api.chartlyrics.com/apiv1.asmx/SearchLyricDirect?artist=michael%20jackson&song=bad вернуть следующий xml:

   <GetLyricResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://api.chartlyrics.com/">
          <TrackId>0</TrackId>
          <LyricChecksum>8a84ddec06f4fffe067edd2fdbece21b</LyricChecksum>
          <LyricId>1710</LyricId>
          <LyricSong>Bad</LyricSong>
          <LyricArtist>Michael Jackson</LyricArtist>
          <LyricUrl>
                 http://www.chartlyrics.com/28h-8gWvNk-Rbj1X-R7PXg/Bad.aspx
          </LyricUrl>
          <LyricCovertArtUrl>
                 http://ec1.images-amazon.com/images/P/B000CNET66.02.MZZZZZZZ.jpg
          </LyricCovertArtUrl>
          <LyricRank>9</LyricRank>
          <LyricCorrectUrl>
                 http://www.chartlyrics.com/app/correct.aspx?lid=MQA3ADEAMAA=
          </LyricCorrectUrl>
          <Lyric>
                    .......Lyric.......
          </Lyric>
   </GetLyricResult>

Я пытался использовать XmlReader, но в нем говорится, что есть недопустимые символы, например XmlReader xmlr = XmlReader.Create (e.Result);

Я попытался использовать вместо этого XDocument, но я не могу получить какие-либо значения для элементов в «GetLyricResult».

  XDocument xmltest = XDocument.Parse(e.Result);
  Console.WriteLine(xmltest.Element("Lyric").Value);

Я уверен, что это очень просто.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 декабря 2011

Вы не обращаете внимания на определенное пространство имен XML !

<GetLyricResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                xmlns="http://api.chartlyrics.com/">

Вам нужно определить это пространство имен XML в запросе Linq-to-XML,тоже:

 XDocument xmltest = XDocument.Parse(e.Result);
 XNamespace ns = "http://api.chartlyrics.com/";

 Console.WriteLine(xmltest.Element(ns + "GetLyricResult").Element(ns + "Lyric").Value);

Кроме того: ваш код все равно не будет работать - если вы используете .Element, вам нужно ссылаться на все элементы из корневого каталога - поэтому здесь вам сначала нужно «разрешить»<GetLyricResult> корневой узел, и только после этого вы можете зайти и захватить <Lyric> узел

0 голосов
/ 10 декабря 2011

Использовать xmlNodeList:

XmlNodeList trackId= xmlDocument.SelectNodes("/GetLyricResult/TrackId");

Затем для записи содержимого:

for (int i = 0; i < trackId.Count; i++)
                {
                    Console.WriteLine("{0}",
                            trackId[i].InnerText);
                }
...