2012-04-24 49 views
4

我剛開始使用LINQ to XML,和我遇到了麻煩給定的XElement的文本內容沒有得到所有的子元素的文本內容,以及。的LINQ to XML - 獲取給定無子元素的文本內容的XElement的文本內容

因此,舉例來說,如果我有下面的XML文檔:

<?xml version="1.0" encoding="utf-8" ?> 
<root xmlns="example.org/rootns">This is root value 
    <children> 
     <child name='child 1'>value 1</child> 
     <child name='child 2'>value 2 
      <grandchild name='grandchild A'>value A</grandchild> 
     </child> 
    </children> 
</root> 

而且我用下面的測試方法:

private static void Test() 
{ 
    string xString = @"<?xml version=""1.0"" encoding=""utf-8"" ?><root xmlns=""example.org/rootns"">This is root value<children><child name='child 1'>value 1</child><child name='child 2'>value 2<grandchild name='grandchild A'>value A</grandchild></child></children></root>"; 

    var xDoc = XDocument.Parse(xString); 

    XNamespace ns = @"example.org/rootns"; 
    string elemName = "child"; 

    var xElems = from e in xDoc.Descendants(ns + elemName) 
       select e; 

    foreach (var xElem in xElems) 
    { 
     Console.WriteLine(xElem.Value); 
    } 
} 

然後我得到的輸出兩行:

value 1 
    value 2value A 

,第一行顯示的第一個孩子的內容 - 這是好的。然而,第二行不僅顯示第一個孩子的文本內容,還顯示該孩子的任何後代。

我怎樣才能得到公正的第二個孩子沒有孫子的文本內容的文本內容呢?

另請注意,示例只是一個簡單的例子來說明我在做什麼,在生產中我不一定知道子元素被稱爲(如果有的話),但我應該能夠得到元素I需要從中獲取文本內容。


Jon Skeet的回答對解決方案有所幫助。只需用以下內容替換foreach循環選擇文本XNodes而非的XElement的值:

... 
foreach (var xElem in xElems) 
{ 
    var values = from n in xElem.Nodes() 
       where n.NodeType == System.Xml.XmlNodeType.Text 
       select n; 

    if (values != null && values.Count() > 0) 
     Console.WriteLine(values.First()); 
} 

回答

4

你要什麼做的,如果有多個文本節點?例如,你可以加入他們一起:

var text = string.Join("", element.Nodes.OfType<XText>().Select(x => x.Value)); 

編輯:如果你只想要一個單一的元素,這是很容易,你已經證明:

var textNode = xElem.Nodes.OfType<XText>().FirstOrDefault(); 
if (textNode != null) 
{ 
    Console.WriteLine(textNode.Value); 
} 
+0

這讓我在正確的軌道上。我不希望每個元素中都有多個文本節點,所以我只是先拿出第一個。我將編輯我的問題以顯示類似於您的示例的解決方案。謝謝。 – Avery 2012-04-24 17:15:58

+0

@Avery:如果您只想要第一個節點,請參閱我的編輯以獲得更簡單的方法。 – 2012-04-24 17:28:30

+0

更好,謝謝。 – Avery 2012-04-24 18:16:57