2011-10-20 3 views
4

У меня возникли XDocument.For пример,Как получить текстовое значение из XDocument?

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

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

+0

@ Хасан Хан - Конечно, вы можете. Это называется модель смешанного контента. Вышеупомянутый XML хорошо сформирован. –

+0

@DevNull Я стою исправлено. Это действительно xml. http://www.w3schools.com/schema/schema_complex_mixed.asp –

ответ

9

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

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

Однако, мне кажется, что вы только хотите, чтобы найти этот кусок текста, который, кажется, немного одинокую по имени textvalue. Нет реального способа признать эту действительную, но необычную вещь. Вы можете проверить, если родитель с именем «имя» или если сам 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 недействителен. –

+0

@DevNull haha ​​yeh, который звучит немного странно, не согласен с стандартом ... – Polity

+0

Вы правы ... они просто ошибаются. ;-) –

3

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

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

Если предположить, что переменный «документ» содержит XDocument отображающей XML выше,

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

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

Смежные вопросы