2009-03-27 5 views
5

Presumendo che non conosco il nome del mio nodo base o dei suoi figli, qual è la sintassi XPath per "tutti i nodi esattamente uno sotto il nodo base?"Qual è l'XPath corretto per "tutti i nodi esattamente uno sotto il nodo base?"

con il modello di essere un XmlNode, ho il seguente codice:

XmlNodeList kvpsList = pattern.SelectNodes(@"//"); 

che sembra giusto per me, ma ho la seguente eccezione:

System.Xml.XPath.XPathException: Expression must evaluate to a node-set. 

Qual è la sintassi corretta?

+0

Nota per i lettori successivi: da "nodo di base", Apparentemente Jekke significa l'elemento di livello superiore (noto anche come "elemento documento" o "elemento più esterno").L'uso di Jekke è confuso perché fa * non * il nodo radice (/), che è il genitore dell'elemento di primo livello. – LarsH

risposta

7

Le due risposte attuali sono sbagliate:

/*/* 

non selezionare tutti i nodi che sono figli del nodo superiore. Non seleziona alcun nodo di testo, istruzioni di elaborazione o commenti che sono figli dell'elemento principale.

Uno XPath espressione che seleziona tutti i nodi che Arte figli dell'elemento superiore è:

/*/node()

// non è un sintatticamente corretta espressione XPath; secondo il XPath Spec:

// è l'abbreviazione di /descendant-or-self :: node()/

Do atto l'inizio di un passo di locazione non finito proprio alla fine dell'abbreviazione espansa. Se non viene aggiunto nulla, l'intera espressione XPath contenente l'abbreviazione è terminata e, quindi, sintatticamente errata.

Un'altra nota è che l'abbreviazione // non è necessaria per specificare la selezione di tutti i nodi figli dell'elemento superiore. Se si voleva per selezionare tutti i nodi del documento XML che discendono dall'elemento superiore, quindi un'espressione XPath che selezionare questi è:

/*//node()

8

Il percorso che stai cercando è

/*/* 

// non è un'espressione XPath significativo, dal momento che è un operatore. Se hai scritto qualcosa come //element, corrisponderebbe a ogni elemento denominato element in qualsiasi punto del documento XML, indipendentemente dalla profondità della gerarchia.

/*/* sta dicendo "corrisponde a ogni nodo che ha due livelli di profondità nella gerarchia".

+0

sia questa risposta che @ Jweede confondono i termini "nodo" e "elemento". Sospetto che @Jekke abbia anche confuso i termini, quindi queste risposte sono corrette per quanto riguarda ciò che intendeva, ma non per ciò che ha detto. I "nodi" includono elementi, attributi, nodi di testo, nodi radice e altri. Gli elementi sono le cose espresse con i tag inizio/fine: ''. L'XPath "*" senza asse specificato corrisponde solo a * elementi *. Vedi la risposta di @ Dimitre per maggiori informazioni. – LarsH