Prise de contact avec XML : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
(Éditions de titres de pages avec l'API)
(Un premier exemple avec les statistiques)
 
(32 révisions intermédiaires par un autre utilisateur non affichées)
Ligne 2 : Ligne 2 :
 
  |module=Prise de contact avec XML
 
  |module=Prise de contact avec XML
 
  |précédent=Le type entier, boucles, comptages
 
  |précédent=Le type entier, boucles, comptages
  |suivant=
+
  |suivant=Introduction à la programmation en C des arbres Xml
 
}}
 
}}
 
Ce module donne des premiers éléments sur l'utilisation d'XML avec DILIB et l'approche ScienceExplor.
 
Ce module donne des premiers éléments sur l'utilisation d'XML avec DILIB et l'approche ScienceExplor.
Ligne 60 : Ligne 60 :
 
9000 <place><placeName><settlement type="city">Gand</settlement> ...
 
9000 <place><placeName><settlement type="city">Gand</settlement> ...
 
</source>
 
</source>
====Exemples de commandes Dilib====
+
==Premiers exemples de commandes Dilib==
 
La bibliothèque Dilib contient des commandes qui permettent de manipuler ces ensembles d'objets XML.
 
La bibliothèque Dilib contient des commandes qui permettent de manipuler ces ensembles d'objets XML.
 +
===SxmlIndent===
  
 
La commande <code>[[Dilib, module SxmlNode, commande SxmlIndent|SxmlIndent]]</code>, par exemple, permet d'obtenir une édition plus lisible. Essayez :
 
La commande <code>[[Dilib, module SxmlNode, commande SxmlIndent|SxmlIndent]]</code>, par exemple, permet d'obtenir une édition plus lisible. Essayez :
Ligne 67 : Ligne 68 :
 
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab | SxmlIndent | more
 
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab | SxmlIndent | more
 
</source>
 
</source>
 +
===SgmlFast===
 
La commande « <code>SgmlFast -c 1</code> » permet de supprimer la première colonne de la table. Essayez :
 
La commande « <code>SgmlFast -c 1</code> » permet de supprimer la première colonne de la table. Essayez :
 
<source lang="sh">
 
<source lang="sh">
Ligne 78 : Ligne 80 :
 
* Dans Dilib, les commandes commençant par le radical <code>Sxml</code> manipulent des documents xml bien formés avec les conventions Sxml (pas de sauts de lignes ni tabulation dans les documents Xml). Leur exécution demandent une analyse (parsing) du document xml, et sont donc relativement longues à exécuter.
 
* Dans Dilib, les commandes commençant par le radical <code>Sxml</code> manipulent des documents xml bien formés avec les conventions Sxml (pas de sauts de lignes ni tabulation dans les documents Xml). Leur exécution demandent une analyse (parsing) du document xml, et sont donc relativement longues à exécuter.
 
* Quelques commandes se contentent de repérer des chaînes dans le document, et seront donc plus rapides. Dans Dilib elles sont préfixées par  <code>Sgml</code>
 
* Quelques commandes se contentent de repérer des chaînes dans le document, et seront donc plus rapides. Dans Dilib elles sont préfixées par  <code>Sgml</code>
 +
 +
===SxmlSelect===
 +
La commande [[SxmlSelect (Dilib)|SxmlSelect]] permet de réaliser des extractions dans un flot d'enregistrements Sxml en utilisant des chemins de balises (XPath dans la terminologie XML).
 +
 +
Par exemple, pour repérer les noms de villes de la table des codes postaux de Belgique, on peut utiliser le chemin :
 +
::<code>place/placeName/settlement</code>
 +
Pour sélectionner tous les noms de ville dans la table on peut procéder ainsi :
 +
<source lang="sh">
 +
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab    \
 +
  | SxmlSelect -s place/placeName/settlement -p @s1
 +
</source>
 +
On obtient alors :
 +
<source lang="xml">
 +
...
 +
<settlement type="city">Louvain</settlement>
 +
<settlement type="town">Heverlee</settlement>
 +
<settlement type="city">Louvain</settlement>
 +
...
 +
</source>
 +
 +
Si l'on désire obtenir simplement les noms de ville on peut utiliser le chemin :
 +
::::<code>place/placeName/settlement/1</code>
 +
:où <code>/1</code> désigne le premier fils (ici le noeud de type texte dont le parent est settlement).
 +
 +
Ainsi
 +
<source lang="sh">
 +
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab    \
 +
  | SxmlSelect -s place/placeName/settlement/1 -p @s1
 +
</source>
 +
produit :
 +
<source lang="xml">
 +
...
 +
Louvain
 +
Heverlee
 +
Louvain
 +
...
 +
 +
On peut utiliser la spécification @1 pour accéder à la clé de l'enregistrement Sxml.
 +
 +
Pour obtenir des couples « ville - code », on peut faire :
 +
 +
<source lang="sh">
 +
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab    \
 +
  | SxmlSelect -s place/placeName/settlement/1 -p @s1 -p @1
 +
</source>
 +
Ce qui donne :
 +
<source lang="xml">
 +
...
 +
Louvain 3000
 +
Heverlee 3001
 +
Louvain 3001
 +
...
 +
 +
</source>
 +
 
==Les chemins de balise illustrés avec l'API de MediaWiki==
 
==Les chemins de balise illustrés avec l'API de MediaWiki==
 
Le moteur MediaWiki dispose d'une api qui donne accès à de nombreuses extraction de de données.
 
Le moteur MediaWiki dispose d'une api qui donne accès à de nombreuses extraction de de données.
Ligne 92 : Ligne 149 :
  
 
<source lang="sh">
 
<source lang="sh">
WIKI=https://lorexplor.istex.fr/Wicri/Europe/fr
+
WIKI=https://wicri-demo.istex.fr/Wicri/Europe/fr
 
</source>
 
</source>
  
Ligne 115 : Ligne 172 :
 
==Éditions de titres de pages avec l'API==
 
==Éditions de titres de pages avec l'API==
  
Le module allpages de l'API permet d'obtenir un résultat correspondant à l'onglet « index alphabétique ».
+
Le module allpages de l'API (https://www.mediawiki.org/wiki/API:Allpages) permet d'obtenir un résultat correspondant à l'onglet « index alphabétique ».
 
<source lang="sh">
 
<source lang="sh">
 
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apfrom=Luxembourg" 2>nul \
 
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apfrom=Luxembourg" 2>nul \
Ligne 162 : Ligne 219 :
 
   </query>
 
   </query>
 
</api>
 
</api>
 +
</source>
 +
 +
==Introduction aux chemins de balises XML==
 +
Dans l'ingénierie XML, il existe un langage de requêtes nommé xPath. La bibliothèque DILIB a implanté un sous ensemble qui permet de désigner un sous arbre XML par un chemin de balises.
 +
===Extraction simple===
 +
Par exemple dans l'exemple ci dessus pour atteindre l'élément allpages, il faut partir de la racine (api) et de passer par le noeud nommé query. Ce cheminement sera noté par <code>api/query/allpages</code>.
 +
 +
Une commande Dilib nommée <code>SxmlSelect</code> permet d'extraire un élément désigné par un chemin de balises.
 +
<source lang="sh">
 +
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 +
| SxmlSelect -g api/query/allpages -p @g1    \
 +
| SxmlIndent
 +
</source>
 +
 +
On obtient alors (toujours sur Wicri/Europe) :
 +
<source lang="xml">
 +
<allpages>
 +
  <p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>
 +
  <p pageid="1498" ns="0" title="Luxembourg (pays)"/>
 +
  <p pageid="1499" ns="0" title="Luxembourg (ville)"/>
 +
</allpages>
 +
</source>
 +
 +
;Explications complémentaires:
 +
* le code de l'option <code>'''-g'''</code> fait référence à la commande grep (un document xml sera sélectionné s'il contient ce chemin de balises).
 +
* l'option <code>'''-p'''</code> introduit une directive d'impression (ici : imprimer le résultat sélectionné par la première directive  <code>'''-g'''</code>).
 +
 +
===Sélection multiple===
 +
Pour obtenir la liste des éléments <code>p</code>, l'option <code>'''-g'''</code> ne convient pas.
 +
<source lang="sh">
 +
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 +
| SxmlSelect -g api/query/allpages/p -p @g1    \
 +
| SxmlIndent
 +
</source>
 +
 +
On obtient alors seulement ceci :
 +
<source lang="xml">
 +
<p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>
 +
</source>
 +
 +
Pour obtenir tous les éléments <code>p</code>, il faut utiliser une autre spécification de sélection : la commande <code>'''-s'''</code> qui constitue une liste d'éléments xml.
 +
 +
<source lang="sh">
 +
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 +
| SxmlSelect -s api/query/allpages/p -p @s1 
 +
</source>
 +
 +
On obtient alors (toujours sur Wicri/Europe) :
 +
<source lang="xml">
 +
<p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>
 +
<p pageid="1498" ns="0" title="Luxembourg (pays)"/>
 +
<p pageid="1499" ns="0" title="Luxembourg (ville)"/>
 +
</source>
 +
 +
Pour accéder aux titres des pages, il faut sélectionner l'attribut title de l'élément p. Ceci s'exprime avec <code>attribute::title</code>
 +
 +
<source lang="sh">
 +
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 +
| SxmlSelect -s api/query/allpages/p/attribute::title -p @s1 
 +
</source>
 +
 +
On obtient alors :
 +
<pre>
 +
Luxembourg (homonymie)
 +
Luxembourg (pays)
 +
Luxembourg (ville)
 +
</pre>
 +
 +
==Exemple plus complet==
 +
Dans la commande SxmlSelect, la directive -p de définir une spécification de sortie plus complète.
 +
 +
Exemple :
 +
<source lang="sh">
 +
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 +
| SxmlSelect -s api/query/allpages/p/attribute::title  \
 +
              -p "<page><wiki>Europe</wiki><title>@s1</title></page>" 
 +
</source>
 +
 +
<source lang="xml">
 +
<page><wiki>Europe</wiki><title>Luxembourg (homonymie)</title></page>
 +
<page><wiki>Europe</wiki><title>Luxembourg (pays)</title></page>
 +
<page><wiki>Europe</wiki><title>Luxembourg (ville)</title></page>
 +
</source>
 +
 +
On a construit une liste de documents XML qui associent le nom du wiki à un nom de page.
 +
 +
Pour faciliter des actions plus complexes, on peut définir une fonction écrite en shell. Elle aura 2 paramètres : un code Wiki et un préfixe de page.
 +
 +
<source lang="sh">
 +
cat <<... >listTitle.sh
 +
#!/bin/sh
 +
WIKI=https://lorexplor.istex.fr/Wicri/\$1/fr
 +
curl "\$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=\$2" 2>nul \\
 +
| SxmlSelect -s api/query/allpages/p/attribute::title                        \\
 +
            -p "<page><wiki>\$1</wiki><title>@s1</title></page>"
 +
...
 +
 +
</source>
 +
 +
Cette écriture pose une difficulté lexicale. En effet les caractères $ et \ doivent échapper aux mécanismes de substitution du shell en les préfixant par \.
 +
 +
Il faut vérifier le contenu du fichier :
 +
<source lang="sh">
 +
#!/bin/sh
 +
WIKI=https://lorexplor.istex.fr/Wicri/$1/fr
 +
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=$2" 2>nul \
 +
| SxmlSelect -s api/query/allpages/p/attribute::title                        \
 +
            -p "<page><wiki>$1</wiki><title>@s1</title></page>"
 +
</source>
 +
 +
On peut l'appeler ainsi :
 +
<source lang="sh">
 +
sh
 +
</source>
 +
 +
On peut maintenant créer des commandes qui vont porter sur une série de wiki, par exemple, pour les wikis correspondant à des pays :
 +
 +
<source lang="sh">
 +
cat <<... >listTitlePays.sh
 +
(
 +
  sh listTitle.sh Europe/France \$1
 +
  sh listTitle.sh Europe/Belgique \$1
 +
  sh listTitle.sh Europe/Allemagne \$1
 +
  sh listTitle.sh Europe/Luxembourg \$1
 +
  sh listTitle.sh Afrique/Maroc \$1
 +
  sh listTitle.sh Amerique/Canada \$1
 +
  sh listTitle.sh Amerique/Bresil \$1
 +
)
 +
...
 +
</source>
 +
==De la présence à la négation==
 +
La commande précédente permet de savoir quels wikis contiennent une page donnée.
 +
 +
<source lang="sh">
 +
sh listTitlePays.sh Luxembourg | SxmlSelect -g page/wiki/1 -p @g1 | sort -u
 +
</source>
 +
 +
Comment trouver ceux qui ne contiennent pas de pages contenant un préfixe donné ?
 +
 +
 +
On va utiliser le fait que tout wiki contient une page accueil.
 +
 +
<source lang="sh">
 +
(
 +
sh listTitlePays.sh Luxembourg
 +
sh listTitlePays.sh Accueil
 +
) | SxmlSelect -g page/wiki/1 -g page/title/1 -p @g1 -p @g2  \
 +
  | sort -u                \
 +
  | IndexBuildRec          \
 +
  | grep "<f>1</f>"        \
 +
  | SxmlSelect -g idx/k/1 -p @g1
 
</source>
 
</source>

Version actuelle datée du 7 juillet 2021 à 08:07

Ce module donne des premiers éléments sur l'utilisation d'XML avec DILIB et l'approche ScienceExplor.

Notions générales sur XML

Avec ScienceExplor, l'accent est mis sur l'exploration de corpus et non sur la création de documents XML.

...

La notation Sxml

La plateforme Dilib est très fortement insérée dans le système Unix, initialement conçu pour des applications de génie logiciel dans lesquelles la documentation et la gestion des sources sont une contrainte importante.

Unix contient donc un nombre important de commandes de base, par exemple grep, qui permettent de manipuler des flots de ligne.

La notation Sxml vise à utiliser les commandes Unix pour manipuler des flots de documents XML.

Sauts de lignes et tabulations

le caractère saut de ligne est un séparateur de ligne sous Unix.

Avec Sxml, le saut de ligne devient un séparateur de document. Son usage est interdit au sein d'un document.

Pour des raisons techniques (voir plus loin), l'usage de la tabulation est également proscrit au sein d'un document Sxml.

Exemple

Un document XML :

<place>
  <placeName>
     <settlement type="city">Gand</settlement>
     <region type="province" nuts="2">Province de Flandre-Orientale</region>
  </placeName>
</place>

Le même en notation Sxml :

<place><placeName><settlement type="city">Gand</settlement><region type="province" nuts="2">Province de Flandre-Orientale</region></placeName></place>

Les tables et dictionnaires Sxml

Les ensembles de données manipulées dans ScienceExplor sont très souvent des tables où à une clé est associée une valeur.

Le clé est généralement une chaîne de caractères. La valeur est souvent un document Xml.

Un exemple avec les codes postaux de Belgique

L'exemple du paragraphe précédent est tiré d'une table de codes postaux utilisés en Belgique.

Sur le wiki Wicri/Belgique, une page de travail contient un tableau wiki :

En utilisant divers outils, cette table est automatiquement traduite dans une table Sxml.

Pour la visualiser, faire sous unix :

source $HOME/Documents/ScienceExplor/Dilib/init.sh
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab

On obtient ceci :

2000-2060	<place><placeName><settlement type="city">Anvers</settlement> ...
 ...
9000	<place><placeName><settlement type="city">Gand</settlement> ...

Premiers exemples de commandes Dilib

La bibliothèque Dilib contient des commandes qui permettent de manipuler ces ensembles d'objets XML.

SxmlIndent

La commande SxmlIndent, par exemple, permet d'obtenir une édition plus lisible. Essayez :

cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab | SxmlIndent | more

SgmlFast

La commande « SgmlFast -c 1 » permet de supprimer la première colonne de la table. Essayez :

cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab | grep Namur
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab | grep Namur | SgmlFast -c 1
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab | grep Namur | SgmlFast -c 1 | SxmlIndent
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab | SxmlIndent | grep Namur
Remarques
  • Dans Dilib, les commandes commençant par le radical Sxml manipulent des documents xml bien formés avec les conventions Sxml (pas de sauts de lignes ni tabulation dans les documents Xml). Leur exécution demandent une analyse (parsing) du document xml, et sont donc relativement longues à exécuter.
  • Quelques commandes se contentent de repérer des chaînes dans le document, et seront donc plus rapides. Dans Dilib elles sont préfixées par Sgml

SxmlSelect

La commande SxmlSelect permet de réaliser des extractions dans un flot d'enregistrements Sxml en utilisant des chemins de balises (XPath dans la terminologie XML).

Par exemple, pour repérer les noms de villes de la table des codes postaux de Belgique, on peut utiliser le chemin :

place/placeName/settlement

Pour sélectionner tous les noms de ville dans la table on peut procéder ainsi :

cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab     \
   | SxmlSelect -s place/placeName/settlement -p @s1

On obtient alors :

 ...
<settlement type="city">Louvain</settlement>
<settlement type="town">Heverlee</settlement>
<settlement type="city">Louvain</settlement>
 ...

Si l'on désire obtenir simplement les noms de ville on peut utiliser le chemin :

place/placeName/settlement/1
/1 désigne le premier fils (ici le noeud de type texte dont le parent est settlement).

Ainsi

cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab     \
   | SxmlSelect -s place/placeName/settlement/1 -p @s1

produit :

 ...
Louvain
Heverlee
Louvain
 ...

On peut utiliser la spécification @1 pour accéder à la clé de l'enregistrement Sxml.

Pour obtenir des couples « ville - code », on peut faire :

<source lang="sh">
cat $DILIB/data/Wicri/Belgique/codePostal.fr.tab     \
   | SxmlSelect -s place/placeName/settlement/1 -p @s1 -p @1

Ce qui donne :

 ...
Louvain	3000
Heverlee	3001
Louvain	3001
 ...

Les chemins de balise illustrés avec l'API de MediaWiki

Le moteur MediaWiki dispose d'une api qui donne accès à de nombreuses extraction de de données.

Un premier exemple avec les statistiques

Sur un wiki, en activant l'onglet « Pages spéciales » puis « statistiques » l'internaute peut visualiser un tableau de statistiques qui donne par exemple le nombre de pages d'un wiki.

Il est possible de désigner cette page par un lien. Par exemple sur ce wiki, on peut cliquer sur « Spécial:Statistiques ».

Il est également possible d'obtenir le contenu de ce tableau sous une forme codée en XML. Ceci est possible avec le module Siteinfo de l'API (voir https://www.mediawiki.org/wiki/API:Siteinfo).

En shell, avec la commande curl il est possible de récupérer ces valeurs dans une forme codée afin de faire des traitements.

Dans les exemples qui vont suivre, pour alléger l'écriture des commandes, la ligne ci dessous range l'url d'un wiki dans la variable d'environnement $WIKI

WIKI=https://wicri-demo.istex.fr/Wicri/Europe/fr

Pour obtenir les statistiques de base en format xml, la ligne ci-dessous lance une action de type « query (recherche) », avec un résultat attendu en dans un format xml, en appelant le module « siteinfo » dans sa partie stistiques.

curl "$WIKI/api.php?action=query&format=xml&meta=siteinfo&siprop=statistics"

On obtient alors :

<?xml version="1.0"?><api batchcomplete=""><query><statistics pages="2283" articles="442" edits="6536" images="2" users="0" activeusers="0" admins="1" jobs="0" /></query></api>

Pour obtenir un résultat plus lisible, on enchaîne avec la commande Dilib SxmlIndent vue plus haut.

curl "$WIKI/api.php?action=query&format=xml&meta=siteinfo&siprop=statistics" 2>nul \
| SxmlIndent

La notation 2>nul sert à inhiber l'impression de résultats intermédiaires de la commande curl.

Éditions de titres de pages avec l'API

Le module allpages de l'API (https://www.mediawiki.org/wiki/API:Allpages) permet d'obtenir un résultat correspondant à l'onglet « index alphabétique ».

curl "$WIKI/api.php?action=query&format=xml&list=allpages&apfrom=Luxembourg" 2>nul \
| SxmlIndent

Par exemple, à la date de rédaction de cet article, le résultat de cette commande est le suivant :

<?xml version="1.0"?>
<api batchcomplete="">
  <continue apcontinue="Maroc" continue="-||"/>
  <query>
    <allpages>
      <p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>
      <p pageid="1498" ns="0" title="Luxembourg (pays)"/>
      <p pageid="1499" ns="0" title="Luxembourg (ville)"/>
      <p pageid="1500" ns="0" title="Lyon"/>
      <p pageid="1501" ns="0" title="Lérida"/>
      <p pageid="1502" ns="0" title="MEMBRIDGE"/>
      <p pageid="1503" ns="0" title="Macédoine-Centrale"/>
      <p pageid="1504" ns="0" title="Madrid"/>
      <p pageid="1505" ns="0" title="Malaga"/>
      <p pageid="1506" ns="0" title="Margaret A. Boden"/>
    </allpages>
  </query>
</api>

Dans un travail plus précis sur le Luxembourg, on peut utiliser le paramètre apprefix:

curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
| SxmlIndent

On obtient alors :

<?xml version="1.0"?>
<api batchcomplete="">
  <query>
    <allpages>
      <p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>
      <p pageid="1498" ns="0" title="Luxembourg (pays)"/>
      <p pageid="1499" ns="0" title="Luxembourg (ville)"/>
    </allpages>
  </query>
</api>

Introduction aux chemins de balises XML

Dans l'ingénierie XML, il existe un langage de requêtes nommé xPath. La bibliothèque DILIB a implanté un sous ensemble qui permet de désigner un sous arbre XML par un chemin de balises.

Extraction simple

Par exemple dans l'exemple ci dessus pour atteindre l'élément allpages, il faut partir de la racine (api) et de passer par le noeud nommé query. Ce cheminement sera noté par api/query/allpages.

Une commande Dilib nommée SxmlSelect permet d'extraire un élément désigné par un chemin de balises.

curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 | SxmlSelect -g api/query/allpages -p @g1     \
| SxmlIndent

On obtient alors (toujours sur Wicri/Europe) :

<allpages>
  <p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>
  <p pageid="1498" ns="0" title="Luxembourg (pays)"/>
  <p pageid="1499" ns="0" title="Luxembourg (ville)"/>
</allpages>
Explications complémentaires
  • le code de l'option -g fait référence à la commande grep (un document xml sera sélectionné s'il contient ce chemin de balises).
  • l'option -p introduit une directive d'impression (ici : imprimer le résultat sélectionné par la première directive -g).

Sélection multiple

Pour obtenir la liste des éléments p, l'option -g ne convient pas.

curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 | SxmlSelect -g api/query/allpages/p -p @g1     \
| SxmlIndent

On obtient alors seulement ceci :

<p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>

Pour obtenir tous les éléments p, il faut utiliser une autre spécification de sélection : la commande -s qui constitue une liste d'éléments xml.

curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 | SxmlSelect -s api/query/allpages/p -p @s1

On obtient alors (toujours sur Wicri/Europe) :

<p pageid="1497" ns="0" title="Luxembourg (homonymie)"/>
<p pageid="1498" ns="0" title="Luxembourg (pays)"/>
<p pageid="1499" ns="0" title="Luxembourg (ville)"/>

Pour accéder aux titres des pages, il faut sélectionner l'attribut title de l'élément p. Ceci s'exprime avec attribute::title

curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 | SxmlSelect -s api/query/allpages/p/attribute::title -p @s1

On obtient alors :

Luxembourg (homonymie)
Luxembourg (pays)
Luxembourg (ville)

Exemple plus complet

Dans la commande SxmlSelect, la directive -p de définir une spécification de sortie plus complète.

Exemple :

curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=Luxembourg" 2>nul \
 | SxmlSelect -s api/query/allpages/p/attribute::title   \
              -p "<page><wiki>Europe</wiki><title>@s1</title></page>"
<page><wiki>Europe</wiki><title>Luxembourg (homonymie)</title></page>
<page><wiki>Europe</wiki><title>Luxembourg (pays)</title></page>
<page><wiki>Europe</wiki><title>Luxembourg (ville)</title></page>

On a construit une liste de documents XML qui associent le nom du wiki à un nom de page.

Pour faciliter des actions plus complexes, on peut définir une fonction écrite en shell. Elle aura 2 paramètres : un code Wiki et un préfixe de page.

cat <<... >listTitle.sh
#!/bin/sh
WIKI=https://lorexplor.istex.fr/Wicri/\$1/fr
curl "\$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=\$2" 2>nul \\
| SxmlSelect -s api/query/allpages/p/attribute::title                         \\
             -p "<page><wiki>\$1</wiki><title>@s1</title></page>" 
...

Cette écriture pose une difficulté lexicale. En effet les caractères $ et \ doivent échapper aux mécanismes de substitution du shell en les préfixant par \.

Il faut vérifier le contenu du fichier :

#!/bin/sh
WIKI=https://lorexplor.istex.fr/Wicri/$1/fr
curl "$WIKI/api.php?action=query&format=xml&list=allpages&apprefix=$2" 2>nul \
| SxmlSelect -s api/query/allpages/p/attribute::title                         \
             -p "<page><wiki>$1</wiki><title>@s1</title></page>"

On peut l'appeler ainsi :

 sh

On peut maintenant créer des commandes qui vont porter sur une série de wiki, par exemple, pour les wikis correspondant à des pays :

cat <<... >listTitlePays.sh
(
  sh listTitle.sh Europe/France \$1
  sh listTitle.sh Europe/Belgique \$1
  sh listTitle.sh Europe/Allemagne \$1
  sh listTitle.sh Europe/Luxembourg \$1
  sh listTitle.sh Afrique/Maroc \$1
  sh listTitle.sh Amerique/Canada \$1
  sh listTitle.sh Amerique/Bresil \$1
)
...

De la présence à la négation

La commande précédente permet de savoir quels wikis contiennent une page donnée.

sh listTitlePays.sh Luxembourg | SxmlSelect -g page/wiki/1 -p @g1 | sort -u

Comment trouver ceux qui ne contiennent pas de pages contenant un préfixe donné ?


On va utiliser le fait que tout wiki contient une page accueil.

(
sh listTitlePays.sh Luxembourg 
sh listTitlePays.sh Accueil
) | SxmlSelect -g page/wiki/1 -g page/title/1 -p @g1 -p @g2  \
  | sort -u                \
  | IndexBuildRec          \
  | grep "<f>1</f>"         \
  | SxmlSelect -g idx/k/1 -p @g1