Как получить текстовое значение из XDocument? - PullRequest
4 голосов
/ 20 октября 2011

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

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

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

Ответы [ 3 ]

9 голосов
/ 20 октября 2011

Текстовые значения интерпретируются 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);

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

3 голосов
/ 20 октября 2011

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

string textValue = yourDoc.Root.Nodes.OfType<XText>().First().Value;
0 голосов
/ 20 октября 2011

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

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

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

...