Разбор XML в Windows Phone 8 C#

я хочу проанализировать XML-файл со следующего URL-адреса: "http://restservice.com/RestServiceImpl.svc/ghhf/cvr"

я могу получить XDocument, используя следующий код:

private void Search(object sender, RoutedEventArgs e)
{
    string url = "http://restservice.schoolpundit.com/RestServiceImpl.svc/search_name/cvr";
    WebClient twitter = new WebClient();
    twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);
    twitter.DownloadStringAsync(new Uri(url));
}

void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null)
        return;
    XDocument doc = XDocument .Parse(e.Result);

    var list = from child in  doc.Descendants("Institutions_search_name")
               select new listrows {
                  inst_name=doc.Element("Inst_name").Value;
               };

     Listbox.ItemSource=list;
} 

но он не показывает никакого Inst_name, на самом деле он не входит в doc.Descendants ("Institutions_search_name"), он также не показывает никаких исключений. Если я сделал какую-либо ошибку, исправьте меня.


person madan V    schedule 08.05.2013    source источник
comment
Ваш код нигде не использует list... он все равно должен выполнять метод doc.Descendants, но вы ничего не делаете с результатом. Вы проверили в отладчике, что сам парсинг прошел успешно? Обратите внимание, что ваш текущий код даже не скомпилируется, поскольку вы пытаетесь использовать свойство с именем value, когда фактическое свойство называется Value. Нет смысла давать нам что-то похожее на ваш код — вы должны предоставить нам фактический код, демонстрирующий проблему.   -  person Jon Skeet    schedule 08.05.2013
comment
я хочу привязать этот список к listBox. я отредактировал вопрос, проверьте его сейчас и скажите мне, как разобрать xml.   -  person madan V    schedule 08.05.2013
comment
Вы так и не сказали, проверяли ли вы в отладчике, что вызов XDocument.Parse сработал. (И код в вашем вопросе ужасно отформатирован. Пожалуйста, приложите немного усилий, чтобы сделать его читабельным, с последовательными отступами и без огромного количества вертикальных пробелов без всякой причины.)   -  person Jon Skeet    schedule 08.05.2013
comment
Между прочим, представленный вами код все еще не будет компилироваться из-за ; после Value. Вы действительно должны были придумать короткий, но полный пример, который вы могли бы опубликовать дословно, прежде чем задавать вопрос.   -  person Jon Skeet    schedule 08.05.2013


Ответы (1)


Я думаю, вам просто не хватает пространства имен, хотя вы также вызываете doc.Element вместо child.Element. Если вы посмотрите на XML, вы увидите это в корневом элементе:

 xmlns="http://schemas.datacontract.org/2004/07/RestService"

Это означает, что каждый элемент, для которого явно не указано пространство имен, находится в этом пространстве имен.

К счастью, с LINQ to XML с этим действительно легко справиться:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = from child in doc.Descendants(ns + "Institutions_search_name")
           select new listrows {
               inst_name=child.Element(ns + "Inst_name").Value
           };

Хотя я бы, вероятно, сделал это без выражения запроса:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = doc.Descendants(ns + "Institutions_search_name")
              .Select(x => new listrows { 
                         inst_name = child.Element(ns + "Inst_name").Value
                      });

На самом деле, учитывая, что вы просто выбираете одну строку, я бы избавился от бита listrows:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = doc.Descendants(ns + "Institutions_search_name")
              .Select(x => child.Element(ns + "Inst_name").Value);

Также обратите внимание, что и listrows, и inst_name нарушают соглашения об именах .NET — стоит попытаться следовать этим соглашениям, чтобы сделать ваш код более понятным для всех.

person Jon Skeet    schedule 08.05.2013
comment
я получаю исключение NullReference Exception в inst_name=child.Element(ns + Inst_name).Value, но в inst_name есть текст - person madan V; 08.05.2013