Ошибка исключения нулевой ссылки синтаксического анализа XML? C # ASP

Я уже больше недели застрял на простом использовании API. Вот подробности.

Пытаюсь вызвать api на ebay.com. Вот как выглядит мой код ...

Это код стартовой страницы:

 protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("Results.aspx?Keywords=" + searchString.Text);  
    }

Страница направлена ​​на этот фрагмент кода:

if (Request.QueryString["Keywords"] != null){
        string keywords = Request.QueryString["Keywords"];
            string myAppID = "HIDDEN";
            var xml = XDocument.Load("http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=" + myAppID + "&RESPONSE-DATA-FORMAT=XML&REST-PAYLOAD&keywords=" + keywords + "&paginationInput.entriesPerPage=5");
            XNamespace ns = "http://www.ebay.com/marketplace/search/v1/services";
            var titles = from item in xml.Root.Descendants(ns + "title")
                              select new{
                                  title = xml.Descendants(ns + "title").Select (x => x.Value),
                              };
        foreach (var item in titles){
                Label1.Text += item;
            } 
        }

Вот пример xml:

<findItemsByKeywordsResponse xmlns="http://www.ebay.com/marketplace/search/v1/services">
<searchReslut count="5">
<item>
    <title></title>
</item>
<item>
    <title></title>
</item>
<item>
    <title></title>
</item>

Я действительно предпочитаю превращать элементы в массив, а не просто перечислять их. Просто подумал, что сначала попробую более простой подход. Я получаю следующую ошибку: вывод цикла for для моей метки выглядит так:

{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }

И исключение вывода:

Первое случайное исключение типа 'System.Threading.ThreadAbortException' произошло в mscorlib.dll Исключение типа 'System.Threading.ThreadAbortException' произошло в mscorlib.dll, но не было обработано в пользовательском коде Поток '' (0x27ee4) завершился с кодом 0 (0x0).

Любая помощь приветствуется!


person allencoded    schedule 27.06.2012    source источник
comment
Ваш XML в образце слишком велик. Я настоятельно рекомендую сделать его меньше (примерно до 7-10 строк), но все же актуальным и воспроизвести проблему. Я подозреваю, что при этом вы обнаружите причину возникновения ошибки. Если нет - ответить было бы намного проще.   -  person Alexei Levenkov    schedule 27.06.2012
comment
Правки внесены выше спасибо Alexei   -  person allencoded    schedule 27.06.2012


Ответы (2)


Исключение составляет:

var titles = from item in xml.Root.Descendants(ns + "title")
             select new
             {
                 title = item.Parent.Element("title").Value,
             };

Вам не нужно переходить к родительскому элементу, вы можете просто напрямую получить значение title, так как это то, что вы ищете:

xml.Descendants(ns + "title").Select (x => x.Value)

Также загляните сюда Задавая лучшие вопросы, так как это, вероятно, поможет вам быстрее / лучшие отзывы. В вашем вопросе содержится тонна кода, который не имеет отношения к делу, и его трудно разобрать, чтобы понять, с чем вам действительно нужна помощь.

person Ocelot20    schedule 27.06.2012
comment
Но есть несколько названий ... Я проверю ваш код и посмотрю, работает ли он! - person allencoded; 27.06.2012
comment
Первая часть запроса (часть Descendants) выбирает все элементы заголовка в xml, а select просто принимает значение каждого из них. Он получит все, что называется title, во всем XDocument. Если это не то, что вы ищете, обновите вопрос. - person Ocelot20; 27.06.2012
comment
нет, похоже, это сработало. но теперь я получаю это, когда пропускаю этот код через цикл for: title = System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String] - person allencoded; 27.06.2012
comment
Это потому, что титул еще не известен (отложенное исполнение). Вы его прогнали и получили исключение? - person Ocelot20; 27.06.2012
comment
Первое случайное исключение типа System.Threading.ThreadAbortException произошло в mscorlib.dll Исключение типа System.Threading.ThreadAbortException произошло в mscorlib.dll, но не было обработано в пользовательском коде - person allencoded; 27.06.2012
comment
Где вы попали в это исключение? Я сократил ваш пример в LINQPad, используя предоставленный XML, и он отлично работает. Либо вам придется сократить пример до мельчайших воспроизводимых шагов, либо никто не сможет помочь. - person Ocelot20; 27.06.2012
comment
Я очистил приведенный выше код в своем сообщении. Единственный код, который не включен выше, - это Respone.Redirect на другой странице, но он отлично работает. - person allencoded; 27.06.2012
comment
Рад, что вы упомянули, что ... Response.Redirect работает, создавая исключение ThreadAbortException. Вероятно, ваша проблема не имеет ничего общего с этим кодом. - person Ocelot20; 27.06.2012
comment
stackoverflow.com/questions/2777105/ Помогу тебе. - person Ocelot20; 27.06.2012
comment
хммм спасибо за инициативу. Я изучу это и снова отредактирую вопрос выше - person allencoded; 27.06.2012
comment
странно то, что это сработало, когда мне нужно было только первое значение. любопытно, почему это может испортить, если мне нужно несколько значений? - person allencoded; 27.06.2012

Это должно быть довольно просто. Попробуйте использовать приведенный ниже код. В верхней части я просто настраиваю ваш образец XML из вашего примера и анализирую его до XElement (примечание: некоторые закрывающие теги отсутствовали, также я предполагаю, что узел searchReslut должен быть searchResult). Затем я беру все узлы-потомки корневого узла с именем «title» и значением, отличным от нуля. Затем я просто просматриваю созданный IEnumerable и объединяю текст метки. Дайте мне знать, если возникнут вопросы.

string ns = "http://www.ebay.com/marketplace/search/v1/services";
string returnedXml = "<findItemsByKeywordsResponse xmlns=\"" + ns + "\">" +
                    "<searchReslut count=\"5\">" +
                        "<item>" +
                            "<title>Title1</title>" +
                        "</item>" +
                        "<item>" +
                            "<title>Title2</title>" +
                        "</item>" +
                        "<item>" +
                            "<title>Title3</title>" +
                        "</item>" +
                     "</searchReslut>" +
                    "</findItemsByKeywordsResponse>";
        XElement xml = XElement.Parse(returnedXml);
        IEnumerable<XElement> titleNodes = xml.Descendants("title").Where(x => x.Value != null);
        foreach (XElement t in titleNodes)
        {
            Label1.Text += t.Value;
        }            
person Chris Knight    schedule 05.07.2012