2012-06-27 48 views
0

我超級堅持一個簡單的API使用超過一個星期了。這裏是細節。解析XML空引用異常錯誤? C#ASP

試圖做一個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 在mscorlib.dll中發生類型'System.Threading.ThreadAbortException'的異常,但未在用戶代碼中處理 線程''(0x27ee4)已退出,代碼爲0(0x0)。

任何幫助表示讚賞!

+1

你樣本中的XML太大了。我強烈建議將它縮小(大約7-10行),但仍然有效並重現該問題。我懷疑你會發現錯誤來自哪裏。如果沒有 - 會更容易回答。 –

+0

以上感謝編輯Alexei – allencoded

回答

1

唯一的例外是來自:

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

你不需要去父母,你可以直接拿到冠軍的價值,因爲這是你要搜索的內容:

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

另外,請看看這裏Asking Better Questions,因爲它可能會讓你更快/更好的迴應。在你的問題中有很多代碼是不相關的,很難解析到你實際需要幫助的東西。

+0

但有多個標題...我會給你的代碼一個旋轉,看看它是否工作! – allencoded

+0

查詢的第一部分('Descendants'部分)選擇xml中的所有標題元素,並且select僅取其中的值。它將在整個XDocument中獲得任何名爲「title」的東西。如果這不是你想要的,請更新問題。 – Ocelot20

+0

nope,似乎工作。但現在我得到這個時,我通過for循環代碼:title = System.Linq.Enumerable + WhereSelectEnumerableIterator'2 [System.Xml.Linq.XElement,System.String] – allencoded

0

這應該是相當簡單的完成。嘗試使用下面的代碼。最上面的部分,我只是從你的例子中設置你的示例XML並解析爲XElement(注意:一些結束標記丟失,我假設'searchReslut'節點應該是'searchResult')。接下來,我抓取根節點中名爲'title'且值不爲null的所有後代節點。然後我簡單地遍歷所創建的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; 
     }