Я играл с простым приложением для 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);
Я уверен, что это очень просто.
Спасибо!
Вы не обращаете внимания на определенное пространство имен 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> узел
.Element
<GetLyricResult>
<Lyric>
Использовать xmlNodeList:
XmlNodeList trackId= xmlDocument.SelectNodes("/GetLyricResult/TrackId");
Затем для записи содержимого:
for (int i = 0; i < trackId.Count; i++) { Console.WriteLine("{0}", trackId[i].InnerText); }