2010-04-14 129 views
2

我剛學習XDocument和LINQ查詢。下面是一些簡單的XML(這看起來並不在這個論壇在我的瀏覽器完全正確的格式,但你的想法。)Noob LINQ - 使用XDocument讀取,過濾XML

<?xml version="1.0" encoding="utf-8"?> 
<quiz 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.com/name XMLFile2.xsd" 
    title="MyQuiz1"> 
    <q_a> 
    <q_a_num>1</q_a_num> 
    <q_>Here is question 1</q_> 
    <_a>Here is the answer to 1</_a> 
    </q_a> 

    <q_a> 
    <q_a_num>2</q_a_num> 
    <q_>Here is question 2</q_> 
    <_a>Here is the answer to 2</_a> 
    </q_a> 
</quiz> 

我可以在XML文件中所有的元素進行迭代,並顯示其名稱,價值,和節點類型在這樣一個列表框,沒有問題:

 XDocument doc = XDocument.Load(sPath); 
     IEnumerable<XElement> elems = doc.Descendants(); 

     IEnumerable<XElement> elem_list = from elem in elems 
              select elem; 

     foreach (XElement element in elem_list) 
     { 
      String str0 = "Name = " + element.Name.ToString() + 
          ", Value = " + element.Value.ToString() + 
          ", Nodetype = " + element.NodeType.ToString(); 
      System.Windows.Controls.Label strLabel = new System.Windows.Controls.Label(); 
      strLabel.Content = str0; 
      listBox1.Items.Add(strLabel); 
     } 

...但現在我想一個「where」子句添加到我的查詢,讓我只能選擇具有特定名稱的元素(如,「qa」)但我的元素列表空了。我試過了 。 。 。

  IEnumerable<XElement> elem_list = from elem in elems 
             where elem.Name.ToString() == "qa" 
             select elem; 

有人請解釋我在做什麼錯嗎? (並且一般來說有一些調試查詢的好技巧?)提前致謝!

回答

1

問題是Name屬性不是字符串,它是XName。當你對它進行約束時,你會得到比你想象的更多的東西。

雖然可以寫在你嘗試的方式查詢,還考慮這些possibilites:

//from nodes immediately below this one 
IEnumerable<XElement> elem_list = doc.Elements("qa"); 

//from nodes of all levels below this node. 
IEnumerable<XElement> elem_list = doc.Descendants("qa"); 
+1

然而,讓不合格的字符串名字,他可以用'elem.Name。 LocalName.' – 2010-04-14 04:06:43

0

我想你也許查詢更改的東西,看起來更像是這個

var query = from q_a in document.Descendants("q_a") 
      select new 
      { 
       Number = (int)q_a.Element("q_a_num"), 
       Question = (string)q_a.Element("q_"), 
       Answer = (string)q_a.Element("_a") 
      }; 

有了這個,你會從每個q_a後裔內部元件的拉入IEnumerable<[Anonymous Type]>,包含數字的每個對象,問題和答案。

但是,如果您只是想提取名稱爲q_a的XElements,則可以使用where子句執行此操作。

IEnumerable<XElement> elem_list = elems.Where(elem => elem.Name.LocalName == "q_a"); 

當然,正如大衛B所示,where子句在這裏沒有必要。

IEnumerable<XElement> elem_list = elems.Elements("q_a");