2010-07-11 1 views
9

Come ottenere un valore di XElement senza ottenere elementi figlio?XElement value in C#

Un esempio:

<?xml version="1.0" ?> 
<someNode> 
    someValue 
    <child>1</child> 
    <child>2</child> 
</someNode> 

Se uso XElement.Value per <someNode> ottengo "somevalue<child>1</child><child>2<child>" stringa ma voglio ottenere solo "somevalue" senza "<child>1</child><child>2<child>" stringa.

risposta

11

si può fare un po 'più semplice che usare Descendants - il metodo Nodes solo i rendimenti i nodi figli diretti:

XElement element = XElement.Parse(
    @"<someNode>somevalue<child>1</child><child>2</child></someNode>"); 
var firstTextValue = element.Nodes().OfType<XText>().First().Value; 

si noti che questo funzionerà anche nel caso in cui gli elementi figlio sono venuti prima di il nodo di testo, come questo:

XElement element = XElement.Parse(
    @"<someNode><child>1</child><child>2</child>some value</someNode>"); 
var firstTextValue = element.Nodes().OfType<XText>().First().Value; 
+0

Se voglio ottenere il valore di tutti i nodi devo necessariamente iterare l'elenco dei nodi? Mi interessano i valori dei nodi che non sono di tipo XText –

+0

@BBHorus: beh se vuoi vedere tutti i nodi, allora sì, devi eseguirne l'iterazione. Non è chiaro cosa stai cercando di fare: potresti voler aggiungere una nuova domanda. –

+0

Oh, non importa, ora mi sono reso conto che ho bisogno di alcuni nodi di testo, ma il primo e l'ultimo. Ho questo elemento: pacchetto com. campione. app1; Quello che voglio è un valore come questo: com.sample.app1, penso di aver bisogno di usare qualche regex o qualcos'altro come iterare i nodi figli e ottenere solo gli elementi saltando il primo e l'ultimo. –

3

Non esiste un modo diretto. Dovrai scorrere e selezionare. Per esempio:

var doc = XDocument.Parse(
    @"<someNode>somevalue<child>1</child><child>2</child></someNode>"); 
var textNodes = from node in doc.DescendantNodes() 
       where node is XText 
       select (XText)node; 
foreach (var textNode in textNodes) 
{ 
    Console.WriteLine(textNode.Value); 
} 
+0

Grazie mille. Nel mio programma mi serve la piena enumerazione dei nodi xml e cambia ogni valore. Con il tuo campione non sono necessario in un enum ricorsivo di nodi xml. – shadeglare

+0

@MaxFX: questo comunque enumera ricorsivamente tutti i nodi all'interno dell'elemento. È nascosto, ma sta ancora accadendo. Vedi la mia risposta per un modo per evitarlo. –

+1

È possibile scrivere var textNodes = doc.DescendantNodes(). OfType (); – Porkopek

0

Penso che ciò che si vuole che sarebbe il primo nodo discendente, in modo da qualcosa come:

var value = XElement.Descendents.First().Value; 

Dove XElement è l'elemento che rappresenta il vostro elemento <someNode>.

È possibile specificamente chiedere per il primo elemento di testo (che è "someValue"), così si potrebbe anche fare:

var value = XElement.Descendents.OfType<XText>().First().Value;