2009-02-19 28 views
0

我是新來的LINQ to XML。我有一個非常簡單的XML文件是這樣的:我的簡單查詢有什麼問題?

<Items> 
    <Item> 
     <Stuff>Strings</Stuff> 
    </Item> 
    <Item> 
     <Stuff>Strings</Stuff> 
    </Item> 
</Items> 

而且我想查詢它是這樣的:

XDocument doc = XDocument.Load(myStream) 
from node in doc.Descendants(XName.Get("Item")) 
    select new { Stuff = node.Element(XName.Get("Stuff")).Value } 

但doc.Descendents(XName.Get( 「項目」))返回空值。這裏我的理解有些不對。

回答

1

你的代碼實際工作:

static void Main(string[] args) 
{ 
    string xml = @" 
       <Items> 
        <Item> 
         <Stuff>Strings</Stuff> 
        </Item> 
        <Item> 
         <Stuff>Strings</Stuff> 
        </Item> 
       </Items>"; 

    using (StringReader myStream = new StringReader(xml)) 
    { 
     XDocument doc = XDocument.Load(myStream); 

     var query = from node in doc.Descendants(XName.Get("Item")) 
        select new { Stuff = 
         node.Element(XName.Get("Stuff")).Value }; 

     foreach (var item in query) 
     { 
      Console.WriteLine("Stuff: {0}", item.Stuff); 
     } 
    } 

應當注意的是,如果元件未被命名空間合格,那麼你並不真正需要的XName:

static void Main(string[] args) 
{ 
    string xml = @" 
       <Items> 
        <Item> 
         <Stuff>Strings</Stuff> 
        </Item> 
        <Item> 
         <Stuff>Strings</Stuff> 
        </Item> 
       </Items>"; 

    using (StringReader myStream = new StringReader(xml)) 
    { 
     XDocument doc = XDocument.Load(myStream); 

     var query = from node in doc.Descendants("Item") 
        select new { Stuff = node.Element("Stuff").Value }; 

     foreach (var item in query) 
     { 
      Console.WriteLine("Stuff: {0}", item.Stuff); 
     } 
    } 
} 
+0

你是對的。它確實有效。但是當我與調試器斷開並開始用命令窗口檢查對象模型時,它不起作用。我從來沒有實際嘗試過,沒有通過執行它。你對此有何看法? – 2009-02-19 18:44:16

0

嘗試使用doc.Root.Decendants( 「項目」)

0

有從System.String要的XName的隱式轉換,所以更常見的形式是

...doc.Descendants("Item") 

...node.Element("Stuff").Value 

除此之外,我建議doc.Root.Descendants()在以前的答案。文檔在加載時仍處於層次結構的「頂層」。我的印象是後裔()是遞歸的,但誰知道,對吧?

+0

謝謝你的提示,這更容易閱讀和寫作。 – 2009-02-19 18:49:53