<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>XMLe XPath</title>
        <link>http://blogs.ugidotnet.org/pietrolibroblog/category/XMLe XPath.aspx</link>
        <description>XMLe XPath</description>
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>XPath: ricerche &amp;quot;case-insensitive&amp;quot; sui nomi dei nodi</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/08/12/93684.aspx</link>
            <description>Se ad esempio abbiamo un file XML del tipo (normalmente non dovrebbe accadere :-)) :     1 &amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
2 &amp;lt;persone&amp;gt;
3   &amp;lt;persona id="1"&amp;gt;&amp;lt;/persona&amp;gt;
4   &amp;lt;PERSONA id="2"&amp;gt;&amp;lt;/PERSONA&amp;gt;
5   &amp;lt;perSona id="3"&amp;gt;&amp;lt;/perSona&amp;gt;
6 &amp;lt;/persone&amp;gt;


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()&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/93684.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/08/12/93684.aspx</guid>
            <pubDate>Tue, 12 Aug 2008 11:02:06 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/08/12/93684.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/93684.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/93684.aspx</trackback:ping>
        </item>
    </channel>
</rss>