Manual:XML Import file manipulation in CSharp/ru

From MediaWiki.org

Jump to: navigation, search

Contents

[edit] Краткий обзор

Эта страница показывает, как использовать схему MediaWiki с Visual Studio .NET C#, чтобы управлять MediaWiki файлом импорта XML в коде, используя объектно-ориентированное программирование вместо того, чтобы работать непосредственно с сырым XML.

Один случай использования это когда у Вас могли бы быть страницы в wiki-формате, который должены быть изменены. Один из способов это сделать - это экспортировать их в файл XML, затем изменить файл XML, и затем импортировать файл XML назад. Конечно, Вы должны убедиться, что пользователи не могут изменить эти файлы во время промежутка между экспортом и переимпортом. Для участков с умеренным использованием этот подход мог бы быть соответствующим.

[edit] Схемы

Тут показан в сокращенном виде файл импорта XML schemaLocation (полностью этот файл XML в http://www.mediawiki.org/xml/export-0.3.xsd):

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" 
version="0.3" 
xml:lang="en">
  <siteinfo>...</siteinfo>
  <page>...</page>
  <page>...</page>
  <page>...</page>
</mediawiki>

Во-первых, загрузите MediaWiki схему из http://www.mediawiki.org/xml/export-0.3.xsd. Поместите файл схемы в папку проекта .NET, и переименуйте файл с названием более интуитивным, например, так MediaWikiExport.xsd. Используя инструмент Visual Studio - xsd.exe, Вы можете сгенерировать .NET файл класса, основанный на этой схеме, используя следующию командную строку VS.NET:

xsd c:/inetpub/wwwroot/MyProject/MediaWikiExport.xsd /c

Эта команда создаст файл класса по имени MediaWikiExport.cs.

[edit] Диаграмма классов

Автосгенерированный файл Класса будет похож на следующие:

Auto-generated VS.NET C# class file based on the Media Wiki import schema


[edit] Диаграмма Схемы

Схема будет похожа на следующие:

Media Wiki import file schema


[edit] .NET Проект

После того, как Вы добавляете свой новый автосгенерированныйй файл класса, добавьте файл в свой проект .NET, вида console application project.

В этом образце кода Вы видите примеры того, как работать с файлом XML объектно-ориентированным способом вместо того, чтобы разбирать сырой XML. Этот образец кода ниже использовался для 1.13.2 версий Media Wiki.

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)
        {
            // name of the exported wiki file
            string file = "ExportedWikiPages.xml";
 
            // instantiate MediaWikiType object
            MediaWikiType mw = new MediaWikiType();
 
            // Open XML file containing exported wiki pages
            System.Xml.XmlDataDocument xml = new System.Xml.XmlDataDocument();
            xml.Load(file);
 
            // Deserialize the XML file into the MediaWikiType object
            XmlSerializer serializer = new XmlSerializer(typeof(MediaWikiType));
            System.Xml.XmlNodeReader oReader = new System.Xml.XmlNodeReader(xml);
            mw = (MediaWikiType)serializer.Deserialize(oReader);
 
            // Loop through all the Pages in the MediaWikiType object
            for (int i = 0; i < mw.page.Length; i++)
            {
                PageType p = mw.page[i];
 
                foreach (Object o in p.Items)
                {
                    // Examine the RevisionType
                    if (o.GetType().Equals(typeof(RevisionType)))
                    {
                        // Cast to RevisionType object
                        RevisionType r = (RevisionType)o;
 
                        // if you increment "timestamp" by one minute, then you'll be able to re-import file
                        r.timestamp = r.timestamp.AddMinutes(1);
 
                        // Update the value of the "text" of the revision
                        // this is the page text
                        TextType text = (TextType)r.text;
                        text.Value = text.Value.Replace("oldvalue", "newvalue");
                    }
                }
            }
 
            //serialize the updated object back to the original file with the corrections/additions
            System.IO.TextWriter writer = new System.IO.StreamWriter(file);
            serializer.Serialize(writer, mw);
            writer.Close();
        }
    }
}

[edit] См. также