[c#][.NET] requete xpath : mais pourquoi ça marche pas?

Bonjour à tous.

Je découvre les joies du xml et des fonctions xpath, mais là je galère : pourquoi ça marche pas ??

donc voilà mon fichier xml (un extrait, hin) :

<?xml version="1.0" encoding="utf-8"?> <root> <item name="help.control.searchUser.title">Search user</item> <item name="help.control.searchUser.text">blablablabla</item> <item name="help.control.identity.title">Identity panel</item> <item name="help.control.identity.text">blablablalbalbal</item> <item name="help.control.newIdentity.title">New identity</item> <item name="help.control.newIdentity.text">blablalba</item> </root>

et j’aimerai avoir que les “titles”.

Voilà la requête quivabien : /root/item/@name[starts-with(., ‘help.control’)][ends-with(., ‘title’)]

J’ai essayé tout plein de trucs, mais j’ai toujours ce message d’erreur :

XsltContext is needed for this query because of an unknown function

est-ce que qqun à une idée de ce qu’il faut faire pour que ça marche dans mon programme ?

je précise que je découvre la manipulation des fichiers xml depuis quelques heures donc soyez clair dans vos possibles (et souhaitées) réponses! merci.

PS : non, je ne peux pas modifier la structure du fichier.

En jetant un oeil rapide sur google, il semble bien que tu ne puisse pas te passe d’un XmlNamespaceManager pour une raison que je te laisse le soin de découvrir. Plus d’infos sur la MSDN.

le lien ne marche pas !?

mais même en lui mettant un namespace manager ça marche pas. j’ai l’impression que le problème vient des fonction starts-with et ends-with.

ends-with c’est du XPATH 2.0 il me semble, donc non supporte je crois. Il se demande ou elle existe cette fonction et il te demande de lui passer un dictionnaire qui va lui expliquer ou lui filer un pointeur vers la fonction qui implemente ends-with.

XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"+ "<root>\r\n"+ "<item name=\"help.control.searchUser.title\">Search user</item>\r\n" + "<item name=\"help.control.searchUser.text\">blablablabla</item>\r\n" + "<item name=\"help.control.identity.title\">Identity panel</item>\r\n" + "<item name=\"help.control.identity.text\">blablablalbalbal</item>\r\n" + "<item name=\"help.control.newIdentity.title\">New identity</item>\r\n" + "<item name=\"help.control.newIdentity.text\">blablalba</item>\r\n" + "</root>"); XPathNavigator nav = doc.CreateNavigator(); XPathNodeIterator iter = nav.Select("/root/item[starts-with(@name, 'help.control') and contains(@name,'title')]"); while (iter.MoveNext()) { Console.WriteLine(iter.Current.InnerXml); }

Ca, ca marche :stuck_out_tongue:

Gloppy, président !

Gloppy il gère :stuck_out_tongue:

merci beaucoup!