#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, которые содержат обычный текст, который вы ищете.