Я только начал использовать 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 1 value 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());
}