2010-11-22 38 views

回答

24

當尋找文本數據在<parent>元素中,您應該查找具有NodeType屬性等於的子節點210。這些節點的類型爲XText。下面的示例說明了這一點:

var p = XElement 
    .Parse("<parent>Hello<child>test1</child>World<child>test2</child>!</parent>"); 

var textNodes = from c in p.Nodes() 
       where c.NodeType == XmlNodeType.Text 
       select (XText)c; 

foreach (var t in textNodes) 
{ 
    Console.WriteLine(t.Value); 
} 

更新:如果你想要的是第一個文本節點,如果有的話,這是一個使用LINQ方法的實例調用,而不是查詢理解語法:

var firstTextNode = p.Nodes().OfType<XText>().FirstOrDefault(); 
if (firstTextNode != null) 
{ 
    var textValue = firstTextNode.Value; 
    ...do something interesting with the value 
} 

注意:在這種情況下,使用First()FirstOrDefault()將比Count() > 0更高性能。 Count總是枚舉整個集合,而FirstOrDefault()只會枚舉,直到找到匹配。

1

msdn什麼性質的XElement爲

沒有文字/值說:

包含所有這些元素的文本內容的字符串。如果有多個文本節點,它們將連接起來。

所以行爲是可以預期的。

你可以這樣做解決問題:

string textContent = parent.HasElements ? "" : parent.Value; 
+3

混合內容元素呢?例如`你好 test1世界 test2` – dtb 2010-11-22 23:23:51

+0

@dtb:父項包含2個子項子項和2個TextNode子項。 – 2010-11-22 23:25:12

+0

考慮我的腦海裏浮現。我不知道這是允許在XML中。 – Femaref 2010-11-22 23:30:28

6

你可以串接在parent所有XText節點的值:

XElement parent = XElement.Parse(
    @"<parent>Hello<child>test1</child>World<child>test2</child>!</parent>"); 

string result = string.Concat(
    parent.Nodes().OfType<XText>().Select(t => t.Value)); 

// result == "HelloWorld!" 

對於比較:

// parent.Value == "Hellotest1Worldtest2!" 

// (parent.HasElements ? "" : parent.Value) == "" 
0
// Create the XElement 
XElement parent = XElement.Parse(
    @"<parent>Hello<child>test1</child>World<child>test2</child>!</parent>"); 

// Make a copy 
XElement temp=new XElement(parent); 

// remove all elements but root 
temp.RemoveNodes(); 

// now, do something with temp.value, e.g. 
Console.WriteLine(temp.value); 
1

令人驚訝的是,Microsoft某處的編碼器認爲將所有文本值作爲連接的和無限制的字符串返回將會很有用。幸運的是,另一位MS開發人員編寫了一個XElement擴展來返回文本節點here的「淺值」。對於那些誰從點擊鏈接心驚肉跳,功能如下...

public static string ShallowValue(this XElement element) 
    { 
     return element 
       .Nodes() 
       .OfType<XText>() 
       .Aggregate(new StringBuilder(), 
          (s, c) => s.Append(c), 
          s => s.ToString()); 
    } 

你這樣稱呼它,是因爲它可以讓你所有的空格太(或者,想起來了,你可以修剪它在擴展中,無論如何)

// element is a var in your code of type XElement ... 
string myTextContent = element.ShallowValue().Trim();