LINQ to XML -Получить данный XElement& #39;текстовое содержимое без дочерних элементов& #39; text content

Я только начал использовать LINQ to XML , и у меня возникли проблемы с получением текстового содержимого данного XElement без получения текстового содержимого всех дочерних элементов.

Так, например, если у меня есть следующий документ XML:


This is root value
    
        value 1
        value 2
            value A
        
    

И я использую следующий метод тестирования:

private static void Test()
{
    string xString = @"This is root valuevalue 1value 2value A";

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

Затем я получаю две строки на выходе:

    value 1
    value 2value A

Первая строка показывает содержимое первого дочернего элемента -это хорошо. Однако во второй строке отображается не только текстовое содержимое первого дочернего элемента, но и все потомки этого дочернего элемента.

Как я могу получить текстовое содержимое только второго потомка без текстового содержимого внука?

Также обратите внимание, что пример — это всего лишь простой пример, иллюстрирующий то, что я делаю, и в производственной среде я не обязательно буду знать, как называются дочерние элементы (если они есть ), но я должен быть в состоянии получить элемент, из которого мне нужно получить текстовое содержимое.


Ответ Джона Скита помог с решением. Просто замените цикл foreach следующим, чтобы выбрать текст XNodes, а не значение XElement:

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

6
задан Peter Mortensen 21 October 2012 в 08:24
поделиться