c# - чтение - Как получить значение XElement, а не значение всех дочерних узлов?




получить значение атрибута xml c# (4)

Пример xml:

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

Если я ищу parent.Value, где родитель XElement, я получаю «test1test2». То, что я ожидаю, - это ». (поскольку нет текста / значения для.

Какую собственность XElement мне следует искать?

https://code.i-harness.com


Вы можете XText значение всех узлов 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)  ==  ""

При поиске текстовых данных в элементе <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);
}

Обновление: если все, что вам нужно, это первый текстовый узел, если таковой имеется, вот пример, использующий вызовы метода LINQ вместо синтаксиса понимания запроса:

var firstTextNode = p.Nodes().OfType<XText>().FirstOrDefault();
if (firstTextNode != null)
{
    var textValue = firstTextNode.Value;
    ...do something interesting with the value
}

Примечание. Использование First() или FirstOrDefault() будет более эффективным, чем Count() > 0 в этом сценарии. Count всегда перечисляет всю коллекцию, а FirstOrDefault() будет перечисляться только до тех пор, пока не будет найдено совпадение.


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






xelement