2012-02-27 16 views
10

Sto tentando di creare una query/stringa XPath che acquisisce un elemento specifico da un documento XML. Sto tentando di afferrare l'elemento con id = 38 ma il mio codice non restituisce mai nulla per qualche motivo.XPath Stringa che acquisisce un elemento con un valore ID specifico

Se si guarda il mio codice & l'organizzazione del mio file XML puoi dirmi che XPath ho bisogno di afferrare l'elemento con id = 38?

Il mio codice è:

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(getProductURL()); 
XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38')"); 

// node always is null for some reason? 

Il modo in cui è organizzata l'XML è in questo modo:

<courseg> 
    <group isempty="False" isbranch="true" id="1" name="abc"> 
     <group isempty="False" isbranch="true" id="38" name="def"></group> 
    </group> 
</courseg> 

risposta

19

L'XPath ciò che serve è

//*[@id='38'] 

Ecco l'esempio con XDocument:

 XDocument xdoc = XDocument.Parse(@" 
<courseg> 
    <group isempty=""False"" isbranch=""true"" id=""1"" name=""abc""> 
     <group isempty=""False"" isbranch=""true"" id=""38"" name=""def""></group> 
    </group> 
</courseg>"); 
     XElement node = xdoc.Root.XPathSelectElement("//*[@id='38']"); 
     Console.WriteLine(node); 
3

utilizzare questa query XPath:

//*[@id = 38] 

Seleziona ogni nodo con attributo id uguali a 38. Se si dispone di essere più specifico, per esempio selezionare group con l'attributo id uguale a 38, utilizzare questo:

//group[@id = 38] 
-1

Quando si parla

xdoc.DocumentElement.SelectSingleNode("id('38')" 

si chiedono XmlDocument per la ricerca di un nodo figlio all'interno nodo principale il cui nome è 'id'. Ma idealmente 'id' è un attributo e non un xmlnode.

quindi bisogna usare //group[@id = '38'] per ottenere tutti nodo figlio con nome 'gruppo' e l'attributo 'id' con un valore di 38

+0

Sbagliato. Questo non è ciò che fa la funzione id(). –

5

la funzione ID ('P38') sarebbe selezionare un elemento con un valore di ID di P38. Ma questo non significa solo "un attributo chiamato 'id'". Significa un attributo dichiarato nella DTD o nello schema come di tipo ID. Non hai mostrato un DTD o uno schema e sospetto che tu non ne abbia uno. Se lo hai fatto, e se ha dichiarato che l'attributo id è di tipo ID, allora il tuo documento non sarebbe valido, perché un valore ID non può essere tutto-numerico (per motivi SGML precedenti, deve assumere la forma di un nome).

In pratica la funzione id() è probabilmente la migliore da evitare a meno che non si abbiano requisiti di prestazioni severi. È troppo fragile: funziona solo quando si convalida il documento di origine con uno schema o DTD. In XSLT, utilizzare invece key(). In alternativa, molti processori ora riconoscono il nome di attributo xml: id come un valore di ID 'auto-dichiarante' senza riferimento a uno schema o DTD: utilizzarlo se il processore lo supporta.

Problemi correlati