2012-10-13 64 views
3

我想解析一個使用LINQ的xml文件,但據我所知,查詢返回null。 (這是WP7) 下面的代碼:XML LINQ查詢不會返回任何內容

 var resultQuery = from q in XElement.Parse(result).Elements("Question") 
          select new Question 
          { 
           QuestionId = q.Attribute("id").Value, 
           Type = q.Element("Question").Attribute("type").Value, 
           Subject = q.Element("Subject").Value, 
           Content = q.Element("Content").Value, 
           Date = q.Element("Date").Value, 
           Timestamp = q.Element("Timestamp").Value, 
           Link = q.Element("Link").Value, 
           CategoryId = q.Element("Category").Attribute("id").Value, 
           UserId = q.Element("UserId").Value, 
           UserNick = q.Element("UserNick").Value, 
           UserPhotoURL = q.Element("UserPhotoURL").Value, 
           NumAnswers = q.Element("NumAnswers").Value, 
           NumComments = q.Element("NumComments").Value, 
          }; 

「結果」 是XML字符串,就像這個一樣。 http://i48.tinypic.com/1ex5s.jpg(無法發佈正確格式的文本這裏有一個圖:P)

錯誤: http://i48.tinypic.com/2uyk2ok.jpg

對不起,如果我沒有解釋它正確,如果這已經被問(試圖尋找,但沒有幫助)。

回答

2

您已遇到XML名稱空間問題。當您只是查詢「問題」時,該字符串將被翻譯成帶有默認名稱空間的XName。 XML中默認名稱空間中沒有元素,只有urn:yahoo:answers名稱空間中的元素(請參閱頂級元素,其中表示xmlns="urn:yahoo:answers")。

您需要查詢正確的XML命名空間,就像這樣:

var ns = new XNameSpace("urn:yahoo:answers"); 
var resultQuery = from q in XElement.Parse(result).Elements(ns + "Question"); 

當挑選出各個屬性,記得要加命名空間也。

XName是一個表示XML名稱的類,該名稱可能具有由XNameSpace定義的名稱空間。這兩個類都實現了一個隱式轉換運算符,允許您從string隱式轉換爲XName。這就是調用工作的原因,只需指定一個string名稱,但僅當元素位於默認名稱空間中時才起作用。

隱含的這使得 非常容易 更容易與XML命名空間一起工作,但是當人們不知道背後的機制時,它會非常快速地產生混淆。 XNameclass documentation有一些很好的例子。

+0

Thx很多爲您的幫助。原來這是我所需要的全部內容 'XNamespace ns = doc.Name.Namespace; var resultQuery =從doc.Elements中的q(ns +「Question」)' – Domas

0

兩種方式來解決這個問題:

  1. 添加根元素是一部分,因爲只有元素搜索一個級別 - XElement.Parse(結果).Root.Elements(「問」)
  2. 使用後裔方法,因爲它會搜索整個xml樹。
相關問題