2012-04-24 15 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> 

をそして、私は、次の試験方法を使用します。

value 1 
    value 2value A 

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); 
    } 
} 

をそれから私は、出力の2行を取得

最初の行には最初の子の内容が表示されます。これは大丈夫です。ただし、2行目には、最初の子供のテキスト内容だけでなく、その子供の任意の後見人も表示されます。

孫のテキストコンテンツがない2番目の子供のテキストコンテンツを取得するにはどうすればよいですか?

サンプルは、私がやっていることを説明するための単なる例に過ぎないことに注意してください。プロダクションでは、子要素があればそれが何であるかを必ずしも知る必要はありませんが、からテキストコンテンツを取得する必要があります。


Jon Skeetの回答が解決策に役立った。ただ、かなりのXElementの値よりもテキストXNodesを選択するには、次のとforeachループを置き換える:複数テキストノードが存在する場合、あなたは何をしたいん

... 
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)); 

EDIT:あなたは、単一の要素が必要な場合、それはあなたが示されてきたよりも簡単です:

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

右のトラックに私を置きます。私は各要素に複数のテキストノードがあるとは思わないので、最初に取り上げます。あなたの例に似た解決策を示すために私の質問を編集します。ありがとう。 – Avery

+0

@Avery:最初のノードだけが必要な場合は、より簡単なアプローチとして編集を参照してください。 –

+0

さらに、ありがとう。 – Avery

関連する問題