Manual:CSharp'de XML Aktarım dosya işlemesi

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

Genel bakış

Bu sayfa, doğrudan ham XML ile çalışmak yerine nesne yönelimli programlama kullanarak MediaWiki XML'sini aktarım dosyası kodunda değiştirmek için MediaWiki şemasının Visual Studio .NET C# ile nasıl kullanılacağını gösterir.

Bunun bir kullanım örneği, bir wiki sitesinde değiştirilmesi gereken birkaç sayfanız olabilir. Bunu yapmanın bir yolu, bunları bir XML dosyasına vermek, ardından XML dosyasını değiştirmek ve XML dosyasını geri almaktır. Elbette, kullanıcıların dışa aktarma ve yeniden içe aktarma arasındaki süre boyunca bu dosyaları değiştiremediğinden emin olmalısınız. Orta düzeyde kullanımı olan siteler için bu yaklaşım uygun olabilir.

Şema

Aşağıdaki XML aktarım dosyasının bu kısaltılmış örneğinde gösterildiği gibi, XML dosyasının schemaLocation değeri https://www.mediawiki.org/xml/export-0.3.xsd konumunda:

<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>

İlk olarak, https://www.mediawiki.org/xml/export-0.3.xsd altında MediaWiki şemasını indirin. Şema dosyasını bir .NET proje klasörüne yerleştirin ve dosyayı MediaWikiExport.xsd gibi daha sezgisel bir şekilde yeniden adlandırmayı düşünün. Visual Studio.NET'in xsd.exe aracını kullanarak, bu VS.NET komut satırı istemini kullanarak bu şemayı temel alan bir .NET sınıfı dosyası oluşturabilirsiniz:

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

Bu komut MediaWikiExport.cs adlı bir sınıf dosyası oluşturur.

Sınıf Diyagramı

Otomatik oluşturulan Sınıf dosyası şu şekilde görünecektir:

MediaWiki aktarım şemasını temel alan otomatik olarak oluşturulan VS.NET C# sınıf dosyası


Sınıf Diyagramı

Şema şöyle görünecektir:

MediaWiki aktarım dosya şeması


.NET Projesi

Otomatik olarak oluşturulan yeni sınıf dosyanızı ekledikten sonra, dosyayı konsol projeniz gibi .NET projenize ekleyin.

Bu kod örneğinde, ham XML'yi ayrıştırmak yerine XML dosyasıyla nesne yönelimli bir şekilde çalışmanın örneklerini göreceksiniz. Aşağıdaki bu kod örneğinin MediaWiki'nin 1.13.2 sürümü için kullanıldığını unutmayın.

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
            foreach (PageType p in mw.page)
            {
                foreach (object o in p.Items)
                {
                    // Examine the RevisionType
                    if (o is RevisionType)
                    {
                        // Cast to RevisionType object
                        RevisionType r = o as RevisionType;

                        // 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 = r.text as TextType;
                        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();
        }
    }
}

C# 3.0 version

Here's the same example using C# 3.0 features, including type inference and a lambda expression.

using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;

namespace WikiFileManipulation {
    class Program {
        static void Main(string[] args) {

            // name of the exported wiki file
            var file = "ExportedWikiPages.xml";
 
            // Open XML file containing exported wiki pages
            var xml =new XmlDataDocument();
            xml.Load(file);
 
            // Deserialize the XML file into the MediaWikiType object
            var serializer = new XmlSerializer(typeof(MediaWikiType));
            var nodeReader = new XmlNodeReader(xml);
            var mw = (MediaWikiType)serializer.Deserialize(nodeReader);
            
            // Loop through all the RevisionType Items from each Page
            foreach (var r in mw.page.SelectMany(p=>p.Items.OfType<RevisionType>())) { 
                // increment the "timestamp" in order to re-import file
                r.timestamp = r.timestamp.AddMinutes(1);
 
                // Update each revision's text
                r.text.Value = r.text.Value.Replace("oldvalue", "newvalue");
            }
 
            // serialize the updates back to the same file
            var writer = new StreamWriter(file);
            serializer.Serialize(writer, mw);
            writer.Close();
        }
    }
}