示例XML:如何獲取XElement的值而不是所有子節點的值?
<parent>
<child>test1</child>
<child>test2</child>
</parent>
如果我找parent.Value其中父的XElement,我得到 「test1test2」。 我期待的是「」。 ?(因爲我應該尋找
示例XML:如何獲取XElement的值而不是所有子節點的值?
<parent>
<child>test1</child>
<child>test2</child>
</parent>
如果我找parent.Value其中父的XElement,我得到 「test1test2」。 我期待的是「」。 ?(因爲我應該尋找
當尋找文本數據在<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()
只會枚舉,直到找到匹配。
msdn什麼性質的XElement爲
沒有文字/值說:
包含所有這些元素的文本內容的字符串。如果有多個文本節點,它們將連接起來。
所以行爲是可以預期的。
你可以這樣做解決問題:
string textContent = parent.HasElements ? "" : parent.Value;
你可以串接在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) == ""
// 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);
令人驚訝的是,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();
混合內容元素呢?例如`你好 test1 世界 test2 ! ` –
dtb
2010-11-22 23:23:51
@dtb:父項包含2個子項子項和2個TextNode子項。 – 2010-11-22 23:25:12
考慮我的腦海裏浮現。我不知道這是允許在XML中。 – Femaref 2010-11-22 23:30:28