Wikipédia:Requêtes XML

Une page de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

MediaWiki utilise le serveur de base de données relationnelle MySQL pour stocker ses données. Comme toute base de données, il est possible de faire des requêtes pour obtenir par exemple la liste des articles modifiés un jour donné.

Depuis le mois de juillet 2005, une partie des dumps SQL a été remplacée par des fichiers XML (voir http://download.wikimedia.org/). Ce guide a pour but d'expliquer comment effectuer des requêtes sur ce nouveau format.

Les fichiers[modifier | modifier le code]

Plusieurs fichiers sont disponibles :

  • pages_current.xml.gz : versions actuelles des pages
  • all_titles_in_ns0.gz : tous les titres dans l'espace principal
  • pages_full.xml.gz : toutes les pages, historiques, etc.

Importation[modifier | modifier le code]

Un dump peut être introduit de plusieurs façons dans un MediaWiki local. Les développeurs recommandent l'utilisation de mwdumper (programme en Java) au lieu du script Php. Ce programme a été conçu par Brion Vibber, les questions relatives à son utilisation sont à poster sur la liste (en anglais) wikitech-l. Le programme est disponible à l'adresse suivante : http://download.wikimedia.org/tools

Néanmoins, voici la procédure pour le faire en php :

zcat pages_full.xml.gz | php importDump.php

ou si le format de l'archive est bzip2 :

bzip2 -dc pages_full.xml.bz2 | php importDump.php

importDump.php se trouve dans le répertoire maintenance de MediaWiki, le script n'est pas très user-friendly mais devrait afficher au bout d'un certain temps ce type de sortie (on peut aussi vérifier avec la commande df ou top que le script est bien en train de travailler) :

100 (0.28551094485 pages/sec 28.8651565243 revs/sec)
100 (0.283854484845 pages/sec 28.7005269627 revs/sec)
100 (0.283835636868 pages/sec 28.7014596001 revs/sec)
100 (0.283820668186 pages/sec 28.7027841736 revs/sec)
100 (0.283806693527 pages/sec 28.7042089833 revs/sec)
(...)

Voir aussi de:Wikipedia:XML-Dump pour des informations supplémentaires.

Format et DTD[modifier | modifier le code]

à faire..

Voir meta:Help:Export en attendant.

Première méthode : Insertion du XML dans une base MySQL[modifier | modifier le code]

La méthode la plus simple, si l'on est habitué à travailler avec les requêtes en SQL, consiste à convertir le fichier XML en fichier SQL. La sortie peut ensuite être insérée dans la base de données comme un dump normal en SQL. Un script en Perl permet d'effectuer la conversion, il est disponible ici (la page est protégée pour éviter des modifications douteuses du code) ou sur la page originale : de:Wikipedia:Xml2sql.

Un autre programme en Java permet de faire une opération similaire.

Si MySQL stoppe l'insertion avec un Got a packet bigger than 'max_allowed_packet' bytes, alors la variable max_allowed_packed dans le fichier my.cnf doit être augmentée. Voir [1] en cas de problèmes de ce type.

Valeurs conseillées (testées avec succès lors de l'insertion via le script Perl) :

key_buffer                              = 16M
max_allowed_packet                      = 32M
table_cache                             = 64
sort_buffer_size                        = 512K
net_buffer_length                       = 8K
read_buffer_size                        = 256K

Avec le script en Perl[modifier | modifier le code]

Il faut avoir créé au préalable la base de données wikipedia (ou autre, changer le paramètre -D dans la ligne de commande si nécessaire) afin de pouvoir insérer les données. Ceci se fait avec la commande "CREATE DATABASE wikipedia" dans la ligne de commande MySQL. (voir la page de Wikipédia à ce sujet).

Pour effectuer la conversion, on procède comme suit (sous Unix/Linux). À noter que des messages d'avertissement apparaissent :

dake@gentoo /tmp $ chmod +x xml2sql
dake@gentoo /tmp $ zcat 20050713_pages_current.xml.gz | ./xml2sql | mysql -u nom_utilisateur -D wikipedia
duplicate key name_title_dup_prevention: 5+Statuts pour une association en France/archive1
...
duplicate key name_title_dup_prevention: 6+Frédéric III de Prusse.jpg
duplicate key name_title_dup_prevention: 6+RévolutionNationale.jpg
dake@gentoo /tmp $

La commande zcat fonctionne de manière similaire à cat, elle écrit le contenu du fichier sur la sortie au fur et à mesure de la décompression.

Une courte requête dans MySQL semble indiquer que la base est valide :

mysql> SELECT DATE_FORMAT(cur_timestamp, '%Y %D %M %h:%i:%s %x' ) FROM cur WHERE cur_title='RC4';
+-----------------------------------------------------+
| DATE_FORMAT(cur_timestamp, '%Y %D %M %h:%i:%s %x' ) |
+-----------------------------------------------------+
| 2005 29th June 11:56:07 2005                        |
+-----------------------------------------------------+
1 row in set (0.00 sec)

Avec le programme en Java[modifier | modifier le code]

Il est codé en Java 1.5 et un readme.txt en allemand décrit les opérations à suivre. Il crée un dump en SQL pour la version 1.4 de MediaWiki (table cur), pas pour la version 1.5.

Il ne tient pas compte de tous les paramètres des articles (version du 26.01.2006) :

  • supporté: id, namespace, title, text, comment, userid, username, timestamp, isredirect
  • non-supporté : restrictions, isminor

Le Jar est disponible ici : http://chsemrau.de/wikipedia/xml2sql.zip


Deuxième méthode : STX[modifier | modifier le code]

Les fichiers des projets Wikimedia sont trop gros pour des langages comme XSLT ou XQuery qui sont normalement utilisés pour faire des requêtes sur des fichiers XML au travers d'une architecture de type DOM (représentation en arbre du fichier XML).

Une alternative repose sur Streaming Transformations for XML (STX), un langage de transformation à une passe pour les fichiers XML. Il est possible de combiner STX et XSLT. Le projet STX se trouve sur Sourceforge à l'adresse suivante : http://stx.sourceforge.net/

Une requête prend alors cette forme :

zcat pages_full.xml.gz | java -jar joost.jar - myscript.stx

Voir meta:Processing_MediaWiki_XML_with_STX pour des exemples.

Troisième méthode : SAX[modifier | modifier le code]

Il est possible de coder ses propres requêtes grâce à SAX (Simple API for XML), une interface classique pour travailler avec du XML qui est basée sur la prise en charge des tags XML et la lecture au fur à et mesure du fichier. Contrairement à DOM qui doit générer un arbre et donc lire l'ensemble du fichier, SAX est capable de travailler sur des fichiers de très grande taille.

Des bibliothèques SAX sont disponibles dans un grand nombre de langages comme Java, Python, etc. Cette approche, qui ressemble à STX, nécessite toutefois d'avoir de bonnes connaissances en programmation.

Quatrième méthode : Parse::MediaWikiDump[modifier | modifier le code]

Parse:MediaWikiDump est un module écrit en Perl par Triddle. Il permet de lancer des requêtes sur le XML assez rapidement pour peu que l'on ait des bases en programmation.

Voir Parse::MediaWikiDump pour plus d'informations.

Extraire les articles dont le titre contient certains caractères spéciaux[modifier | modifier le code]

#!/usr/bin/perl -w

use strict;
use Parse::MediaWikiDump;
use utf8;

my $file = shift(@ARGV) or die "un dump doit être spécifié : ./extract.pl nom_dump.xml";
my $pages = Parse::MediaWikiDump::Pages->new($file);
my $page;

binmode STDOUT, ":utf8";

while(defined($page = $pages->page)) {
  #main namespace only
  next unless $page->namespace eq '';
         if ($page->title =~ /æ|Æ|á|Á|ā|Ā|ä|Ä|å|ĉ|Ĉ|ē|Ē|ē|ě|Ě|Ë/) {
           print $page->title, "\n";
  }
}

Voir aussi[modifier | modifier le code]

API.php

L'interface de programmation du service web (agent <-> ressource) Wikipédia est disponible ici : http://fr.wikipedia.org/w/api.php

Kézako ? vous (ou votre robot) êtes un agent et Wikipédia est votre ressource, vous communiquez avec elle via le protocole de requêtes http pour lui demander de vous envoyer certaines données (par exemple le contenu de toutes les pages d'une certaine catégorie, ou la liste des derniers inscrits) qui vous sont remises en XML. Vous ou votre robot pouvez ensuite traiter ces données (par exemple chercher et corriger une faute d'orthographe parmi le texte des articles) puis de nouveau via l'http effectuer les commandes de l'API (pour remplacer du texte il faut utiliser les commandes suivantes de l'API : action et ses paramètres login (pour vous logger), query (pour obtenir le texte), edit (pour modifier ce texte) et sans doute quelques autres tels que minor (pour marquer votre modification comme étant mineure) et summary (pour indiquer un résumé de votre modification.


Tools clipart.png Obtenir les informations à propos de la dernière révision de la page Accueil :

api.php ? action=query & prop=info|revisions & titles=Accueil

<?xml version="1.0"?>
<api>
  <query>
    <pages>
      <page pageid="3084756" ns="0" title="Accueil" touched="2009-05-14T15:23:48Z" lastrevid="40759274" counter="0" length="3405">
        <revisions>
          <rev revid="40759274" minor="" user="Xfigpower" timestamp="2009-05-11T11:35:43Z" comment="corr lien modèle" />
        </revisions>
      </page>
    </pages>
  </query>
</api>

Le 14 mai 2009 à 17:36 (CEST), le dernier revisionuser était Xfigpower (d · c · b). Cliquez sur le lien pour voir qui c'est en ce moment.