Manuel:Manipuler le fichier d'import XML en CSharp
Présentation
Cette page montre comment utiliser le schéma MediaWiki avec C# de Visual Studio .NET pour manipuler un fichier XML MediaWiki importé dans le code en utilisant la programmation orientée objet au lieu de travailler directement avec le XML à plat.
Un cas d'utilisation est que vous pourriez avoir un certain nombre de pages à modifier sur un site wiki. Une façon de faire est de les exporter dans un fichier XML, puis de manipuler ce fichier, puis de l'importer. Bien sûr, vous devez être sûr que les utilisateurs ne peuvent pas modifier ces fichiers pendant la période entre l'exportation et la réimportation. Pour les sites utilisant une utilisation modérée, cette approche pourrait être appropriée.
Schéma
Comme montré ci-après, dans cet exemple abrégé de fichier d'import XML, le schemaLocation du fichier XML se trouve sur https://www.mediawiki.org/xml/export-0.3.xsd :
<mediawiki xmlns="https://www.mediawiki.org/xml/export-0.3/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.mediawiki.org/xml/export-0.3/ https://www.mediawiki.org/xml/export-0.3.xsd"
version="0.3"
xml:lang="en">
<siteinfo>...</siteinfo>
<page>...</page>
<page>...</page>
<page>...</page>
</mediawiki>
Tout d'abord, téléchargez le schéma MediaWiki de https://www.mediawiki.org/xml/export-0.3.xsd. Placeez le fichier du schéma dans un répertoire de projet .NET, puis renommez le fichier en quelque chose de plus intuitif tel que MediaWikiExport.xsd. En utilisant l'outil xsd.exe de Visual Studio .NET, vous pouvez générer un fichier de classe .NET basé sur ce schéma en utilisant cette invite du mode ligne de commande VS.NET :
xsd c:/inetpub/wwwroot/MyProject/MediaWikiExport.xsd /c
Cette commande va créer un fichier de classe nommé MediaWikiExport.cs.
Diagramme de classe
Le fichier de classe généré automatiquement ressemblera à ceci :
Diagramme du schéma
Le schéma sera comme ceci :
Projet .NET
Après avoir ajouté votre nouveau fichier de classe généré automatiquement, ajoutez le fichier dans votre projet .NET, comme un projet d'application de console.
Dans cet extrait de code, vous verrez des exemples de la façon de travailler avec le fichier XML de manière orientée objet au lieu d'analyser le XML brut. Notez que l'échantillon de code ci-dessous a été utilisé pour la version 1.13.2 de MediaWiki.
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace WikiFileManipulation
{
class Program
{
static void Main(string[] args)
{
// nom du fichier wiki exporté
string file = "ExportedWikiPages.xml";
// instancier l'objet MediaWikiType
MediaWikiType mw = new MediaWikiType();
// ouvrir le fichier XML contenant des pages wiki exportées
System.Xml.XmlDataDocument xml = new System.Xml.XmlDataDocument();
xml.Load(file);
// désérialiser le fichier XML dans l'objet MediaWikiType
XmlSerializer serializer = new XmlSerializer(typeof(MediaWikiType));
System.Xml.XmlNodeReader oReader = new System.Xml.XmlNodeReader(xml);
mw = (MediaWikiType)serializer.Deserialize(oReader);
// boucler sur toutes les pages de l'objet MediaWikiType
foreach (PageType p in mw.page)
{
foreach (object o in p.Items)
{
// examiner le type de révision
if (o is RevisionType)
{
// convertir en objet RevisionType
RevisionType r = o as RevisionType;
// si vous incrémentez "timestamp" d'une minute,
// alors vous pourrez ré-importer le fichier
r.timestamp = r.timestamp.AddMinutes(1);
// mettre à jour la valeur du "texte" de la révision
// c'est le texte de la page
TextType text = r.text as TextType;
text.Value = text.Value.Replace("oldvalue", "newvalue");
}
}
}
// sérialiser à nouveau l'objet actualisé vers le fichier original + corrections/ajouts
System.IO.TextWriter writer = new System.IO.StreamWriter(file);
serializer.Serialize(writer, mw);
writer.Close();
}
}
}
C# version 3.0
Voici le même exemple utilisant les fonctionnalités C# 3.0, y compris l'inférence de type et une expression lambda.
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
namespace WikiFileManipulation {
class Program {
static void Main(string[] args) {
// nom du fichier wiki exporté
var file = "ExportedWikiPages.xml";
// ouvrir le fichier XML contenant des pages wiki exportées
var xml =new XmlDataDocument();
xml.Load(file);
// désérialiser le fichier XML dans l'objet MediaWikiType
var serializer = new XmlSerializer(typeof(MediaWikiType));
var nodeReader = new XmlNodeReader(xml);
var mw = (MediaWikiType)serializer.Deserialize(nodeReader);
// boucler sur tous les éléments de RevisionType de chaque Page
foreach (var r in mw.page.SelectMany(p=>p.Items.OfType<RevisionType>())) {
// incrémenter "timestamp" pour réimporter le fichier
r.timestamp = r.timestamp.AddMinutes(1);
// mettre à jour le texte de chaque révision
r.text.Value = r.text.Value.Replace("oldvalue", "newvalue");
}
// sérialiser à nouveau les mises à jour dans le même fichier
var writer = new StreamWriter(file);
serializer.Serialize(writer, mw);
writer.Close();
}
}
}