Manuel:Manipuler le fichier d'import XML en CSharp

This page is a translated version of the page Manual:XML Import file manipulation in CSharp and the translation is 100% complete.

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 :

 
Fichier de classe VS.NET C# généré automatiquement et basé sur le schéma d'importation MediaWiki


Diagramme du schéma

Le schéma sera comme ceci :

 
Schéma d'importation de fichiers MediaWiki


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();
        }
    }
}