Se ad esempio abbiamo un file XML del tipo (normalmente non dovrebbe accadere :-)) :
1 <?xml version="1.0" encoding="utf-8" ?>
2 <persone>
3 <persona id="1"></persona>
4 <PERSONA id="2"></PERSONA>
5 <perSona id="3"></perSona>
6 </persone>
e tramite XPath vogliamo recuperare tutti i nodi persona figli di persone, dato che le ricerche XPath (e XML) sono case-sensitive, possiamo utilizzare la funzione XPath translate() in questo modo:
1 XmlDocument xmlDocTest = new XmlDocument();
2 xmlDocTest.Load("esempio.xml");
3 XmlNodeList list = xmlDocTest.SelectNodes("//persone/*[translate(local-name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='persona']");
4
5 foreach (XmlNode nodeItem in list)
6 Console.WriteLine("Nodo " + nodeItem.Attributes["id"].Value);
Dove :
local-name() - restituisce il nome locale di un nodo senza il prefisso di namespace
translate() - Ritorna la sottostringa all'interno del primo argomento sostituendo i caratteri del secondo argomento con quello del terzo.
Se invece di eseguire la conversione in minuscolo, volessimo eseguire la conversione in maiuscolo basterebbe sostituire l'espressione XPath precedente:
1 "//persone/*[translate(local-name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='persona']"
con la seguente:
1 "//persone/*[translate(local-name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='PERSONA']"
L'utilizzo di una delle due espressioni conduce ovviamente allo stesso risultato.
Technorati Tag:
XPath,
Translate()