Manual:XML Import file manipulation in CSharp/cs
Přehled
Tato stránka ukazuje, jak používat schéma MediaWiki s Visual Studiem .NET C# k manipulaci s importovaným souborem MediaWiki XML v kódu pomocí objektově orientovaného programování namísto přímé práce se surovým XML.
Jedním z případů použití je, že na webu wiki můžete mít několik stránek, které je třeba upravit. Jedním ze způsobů, jak to udělat, je exportovat je do souboru XML, poté s ním manipulovat a poté jej importovat zpět. Samozřejmě byste se měli ujistit, že uživatelé nemohou tyto soubory upravovat během doby mezi exportem a opětovným importem. Pro weby s mírným používáním může být tento přístup vhodný.
Schéma
Jak je znázorněno v tomto zkráceném příkladu importního souboru XML níže, schemaLocation souboru XML se nachází v adresáři 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>
Nejprve si stáhněte schéma MediaWiki z adresáře https://www.mediawiki.org/xml/export-0.3.xsd. Umístěte soubor schématu do složky projektu .NET a zvažte přejmenování souboru na něco intuitivnějšího, například MediaWikiExport.xsd. Pomocí nástroje xsd.exe ve Visual Studiu.NET můžete vygenerovat soubor třídy .NET založený na tomto schématu pomocí tohoto příkazového řádku VS.NET:
xsd c:/inetpub/wwwroot/MyProject/MediaWikiExport.xsd /c
Tento příkaz vytvoří soubor třídy s názvem MediaWikiExport.cs.
Diagram tříd
Automaticky vygenerovaný soubor třídy bude vypadat takto:

Diagram schéma
Schéma bude vypadat takto:

Project .NET
Po přidání nového automaticky generovaného souboru třídy přidejte soubor do projektu .NET, například do projektu konzolové aplikace.
V této ukázce kódu uvidíte příklady, jak pracovat se souborem XML objektově orientovaným způsobem namísto parsování nezpracovaného XML. Upozorňujeme, že tato ukázka kódu níže byla použita pro verzi MediaWiki 1.13.2.
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)
{
// název exportovaného wiki souboru
string file = "ExportedWikiPages.xml";
// vytvoření instance objektu MediaWikiType
MediaWikiType mw = new MediaWikiType();
// otevření souboru XML obsahujícího exportované stránky wiki
System.Xml.XmlDataDocument xml = new System.Xml.XmlDataDocument();
xml.Load(file);
// deserializování souboru XML do objektu MediaWikiType
XmlSerializer serializer = new XmlSerializer(typeof(MediaWikiType));
System.Xml.XmlNodeReader oReader = new System.Xml.XmlNodeReader(xml);
mw = (MediaWikiType)serializer.Deserialize(oReader);
// procházení všech stránek v objektu MediaWikiType
foreach (PageType p in mw.page)
{
foreach (object o in p.Items)
{
// prozkoumání typu revize
if (o is RevisionType)
{
// přetypování na objekt RevisionType
RevisionType r = o as RevisionType;
// pokud zvýšíte "časové razítko" o jednu minutu, budete moci soubor znovu importovat.
r.timestamp = r.timestamp.AddMinutes(1);
// aktualizace hodnoty "textu" revize
// toto je text stránky
TextType text = r.text as TextType;
text.Value = text.Value.Replace("oldvalue", "newvalue");
}
}
}
// serializace aktualizovaného objektu zpět do původního souboru s opravami/doplněními
System.IO.TextWriter writer = new System.IO.StreamWriter(file);
serializer.Serialize(writer, mw);
writer.Close();
}
}
}
C# verze 3.0
Zde je stejný příklad s využitím funkcí C# 3.0, včetně odvozování typů a výrazu lambda.
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
namespace WikiFileManipulation {
class Program {
static void Main(string[] args) {
// název exportovaného wiki souboru
var file = "ExportedWikiPages.xml";
// otevření souboru XML obsahujícího exportované stránky wiki
var xml =new XmlDataDocument();
xml.Load(file);
// deserializování souboru XML do objektu MediaWikiType
var serializer = new XmlSerializer(typeof(MediaWikiType));
var nodeReader = new XmlNodeReader(xml);
var mw = (MediaWikiType)serializer.Deserialize(nodeReader);
// procházení všechn položek RevisionType z každé stránky
foreach (var r in mw.page.SelectMany(p=>p.Items.OfType<RevisionType>())) {
// zvýšení hodnoty "časového razítka" pro opětovný import souboru
r.timestamp = r.timestamp.AddMinutes(1);
// aktualizace textu každé revize
r.text.Value = r.text.Value.Replace("oldvalue", "newvalue");
}
// seřazení aktualizací zpět do stejného souboru
var writer = new StreamWriter(file);
serializer.Serialize(writer, mw);
writer.Close();
}
}
}