サンプル XML:
<parent>
<child>test1</child>
<child>test2</child>
</parent>
親がXElementであるparent.Valueを探すと、「test1test2」が得られます。私が期待しているのは "" です。( のテキスト/値がないため。
XElement のどのプロパティを探す必要がありますか?
要素内のテキスト データを探すときは、プロパティが に等しい<parent>
子ノードを探す必要があります。これらのノードのタイプはです。次のサンプルは、これを示しています。NodeType
XmlNodeType.Text
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);
}
更新:必要なのが最初の Text ノードだけである場合は、クエリ内包構文の代わりに LINQ メソッド呼び出しを使用する例を次に示します。
var firstTextNode = p.Nodes().OfType<XText>().FirstOrDefault();
if (firstTextNode != null)
{
var textValue = firstTextNode.Value;
...do something interesting with the value
}
注:First()
orを使用すると、このシナリオFirstOrDefault()
よりもパフォーマンスが向上します。常にコレクション全体を列挙しますが、一致するものが見つかるまで列挙します。Count() > 0
Count
FirstOrDefault()
XText
のすべてのノードの値を連結できますparent
。
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) == ""
msdnは次のように述べています。
この要素のすべてのテキスト コンテンツを含む文字列。複数のテキスト ノードがある場合、それらは連結されます。
したがって、動作は予想されます。
次のようにして問題を解決できます。
string textContent = 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);