30

サンプル XML:

<parent>
<child>test1</child>
<child>test2</child>
</parent>

親がXElementであるparent.Valueを探すと、「test1test2」が得られます。私が期待しているのは "" です。( のテキスト/値がないため。

XElement のどのプロパティを探す必要がありますか?

4

5 に答える 5

26

要素内のテキスト データを探すときは、プロパティが に等しい<parent>子ノードを探す必要があります。これらのノードのタイプはです。次のサンプルは、これを示しています。NodeTypeXmlNodeType.TextXText

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() > 0CountFirstOrDefault()

于 2010-11-22T23:38:45.777 に答える
8

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)  ==  ""
于 2010-11-22T23:24:09.633 に答える
1

msdnは次のように述べています。

この要素のすべてのテキスト コンテンツを含む文字列。複数のテキスト ノードがある場合、それらは連結されます。

したがって、動作は予想されます。

次のようにして問題を解決できます。

string textContent = parent.HasElements ? "" : parent.Value;
于 2010-11-22T23:22:36.090 に答える
1
// 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);
于 2011-12-19T17:26:51.667 に答える