Manual:CSharp'de XML Aktarım dosya işlemesi
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:
Sınıf Diyagramı
Şema şöyle görünecektir:
.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();
}
}
}