Как получить текстовое значение из XDocument?

#c# #xml #xml-serialization

#c# #xml #xml-сериализация

Вопрос:

У меня есть XDocument.Например,

 <cars>
<name>
<ford>model1</ford>
   textvalue   
<renault>model2</renault>
</name>
</cars>
  

Как получить текстовое значение из XDocument? Как определить текстовое значение среди элементов?

Комментарии:

1. @Хасан Кхан — Конечно, ты можешь. Это называется смешанной моделью контента. Приведенный выше XML хорошо сформирован.

2. @DevNull Я исправлен. Это допустимый xml. w3schools.com/schema/schema_complex_mixed.asp

Ответ №1:

Текстовые значения интерпретируются XLinq как XText. поэтому вы можете легко проверить, имеет ли узел тип XText или путем проверки nodeType см.:

 // get all text nodes
var textNodes = document.DescendantNodes()
                        .Where(x => x.NodeType == XmlNodeType.Text);
  

Однако мне кажется, что вы хотите найти только тот фрагмент текста, который кажется немного одиноким, с именем textvalue . Нет реального способа распознать эту действительную, но необычную вещь. Вы можете либо проверить, назван ли родительский элемент ‘name’, либо сам TextNode один или не видит:

 // get 'lost' textnodes
var lastTextNodes = document.DescendantNodes()
                            .Where(x => x.NodeType == XmlNodeType.Text)
                            .Where(x => x.Parent.Nodes().Count() > 1);
  

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

Комментарии:

1. 1 за несогласие с другими, утверждающими, что XML неверен.

Ответ №2:

Вы можете использовать свойство Nodes для перебора дочерних узлов корневого элемента документа. С этого момента текстовые узлы будут представлены экземплярами XText, а их текстовое значение доступно через их свойство Value:

 string textValue = yourDoc.Root.Nodes.OfType<XText>().First().Value;
  

Ответ №3:

Предполагая, что переменная «doc» содержит XDocument, представляющий ваш XML выше,

 doc.XPathSelectElement("cars/name").Nodes().OfType<XText>() 
  

Это должно дать вам все текстовые узлы типа XText, которые содержат обычный текст, который вы ищете.