2013-03-16 63 views
0

我是XDocument和LINQ的新手。這裏是我想要做的事:LINQ to XML查詢中的基本過濾

XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <chapters total-chapters="3"> 
    <Chapter chapter-no="1"> 
     <chapter-summary>this is chapter 1</chapter-summary> 
    </Chapter> 
    <Chapter chapter-no="2"> 
     <chapter-summary>this is chapter 2</chapter-summary> 
    </Chapter> 
    <Chapter chapter-no="3"> 
     <chapter-summary>this is chapter 3</chapter-summary> 
    </Chapter> 
    <Chapter chapter-no="4"> 
     <chapter-summary>this is chapter 4</chapter-summary> 
    </Chapter> 
</chapters> 
</root> 

現在我需要閱讀所有與特定章節,沒有記錄。我寫我的LINQ查詢爲:

IEnumerable<XElement> elem_list = 
    from e in xdoc.Elements("Chapter") 
    where (string) e.Attribute("chapter-no") == "1" 
    select e; 

foreach (XElement e in elem_list) 
{ 
    Console.WriteLine(e); 
} 

但是elem_list沒有得到填充,也沒有顯示任何內容。

回答

2

.Elements("Chapter")只在當前元素的直接子元素內進行搜索(根目錄爲xdoc)。

您可以使用.Descendants("Chapter")

IEnumerable<XElement> elem_list = from e in xdoc.Descendants("Chapter") 
            where (string) e.Attribute("chapter-no") == "1" 
            select e; 

或指定全項路徑:

IEnumerable<XElement> elem_list = from e in xdoc.Root.Element("chapters").Elements("Chapter") 
            where (string) e.Attribute("chapter-no") == "1" 
            select e; 

另一種方法 - 用XPath選擇:

xdoc.XPathSelectElements("root/chapters/Chapter[@chapter-no=1]"); 

using System.Xml.XPath;必要使最後樣品工作。

+0

XPath的似乎是非常有幫助...謝謝 – 2013-03-17 03:20:57

0

你可以做類似如下:

IEnumerable<XElement> elem_list = 
    xdoc.Descendants("Chapter") 
    .Where (c => c.Attribute("chapter-no").Value.Equals("1"));