Syntaxe XPAth

Résolu
Signaler
Messages postés
3
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007
-
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
-
Bonjour,
J'utilise un fichier XML pour une petite application simple de gestion de liste de livre et j'utilise des requêtes XPAth pour faire des recherches dedans mais j'ai un problème avec la syntaxe XPAth.
voici grosso modo le format du fichier XML :

<livre>
    <titre>Titre</titre>
    <genre>genre </genre>
    etc.. pour chaque information du livre
</livre>

Je cherche la syntaxe XPath me permettant de retrouver l'ensemble des livres dont l'une des information (donc l'un des neuds enfant) a une certaine valeur.

Quelqu'un aurait une petite idée?
Merci d'avance
Si d'ailleurs vous conaissez des liens vers de la dox concernant XPath je suis preneur.

8 réponses

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Hello,

à mon avis, le xPath à utiliser doit être du genre /biblio/livre[titre='Titre1'], pour par exemple trouver tout les livres dont le titre est "Livre1".

Deux petites choses billou_13 : on peut faire la sélection directement dans le xpath, et si tu connais le path exact, pas besoin de doubler les /.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
28
Voici un petit exemple histoire d'expliquer tout cela :

//-- Code ---

using

System.Xml;
XmlDocument

xmlDoc =
new
XmlDocument();xmlDoc.Load(

@"c:\test.xml");

XmlNodeList livreNodes = xmlDoc.SelectNodes(
"//biblio//livre");

foreach (
XmlNode curNode
in livreNodes){

XmlNode titreNode = curNode.SelectSingleNode(
"//titre");

string titre = titreNode.InnerText;

//OU

foreach (
XmlNode childNode
in titreNode.ChildNodes){

string node = childNode.Name;

string text = childNode.InnerText;}

//etc...}

//-- Fin Code --

Remarque: la propriété InnerText est à vérifier (tu as aussi InnerXml, OuterText, ...). Mais il me semble que c'est celle-là qui est correcte pour toi.

Bon courage

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
3
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

billou : Je cherce justement à utiliser XPath pour éviter d'avoir à parcourir l'ensemble de la liste sinon ce serait déjà fait.
SharpMoa : OK Merci je vais tester ta solution à priori elle a l'air logique vu ce que je connais de XPath, je n'aurais pas pense à quelque chose de si simple en fait
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Voire ma source sur XPath
http://www.csharpfr.com/tutoriaux/XPATH-LANGUAGE_536.aspx

<hr />
-My Blog-
Messages postés
1
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

Salut
il me semble qu'il faut un @ dans le xpath au niveau de la restriction sur l'attribut :
string value = xmlDoc.SelectSingleNode(@"/biblio/livre[@titre='Titre1']").InnerText;

Max
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Hello Maxv,


Il ne faut de @ que pour les attributs. Comme l'exemple montré ne contient que des éléments, pas besioin de @.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
3
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
26 novembre 2007

OK Super merci beaucoup à vous tous ça marche nickel maintenant.
Comme quoi finalement c'était plus simple qu'il n'y paraîssait
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
De rien ,

Même si ce n'est pas une question spécifique c#, ça fait toujours plaisir de répondre à une réponse précise posé par quelqu'un de poli.
N'oublie pas de valider la (les) bonne(s) réponse(s), ça aidera les personnes qui feront une recherche sur le même sujet et verront cette question.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)