Handbuch:XML-Dumps importieren
Diese Seite beschreibt Methoden für den Import von XML-Dumps. XML-Dumps enthalten den Inhalt eines Wikis (Wikiseiten mit allen Versionen) ohne Daten mit Bezug zur Seite. Ein XML-Dump erstellt kein vollständiges Backup der Wiki-Datenbank, denn der Dump enthält keine Benutzerkonten, Bilder, Bearbeitungslogbücher, etc.
Die Seite Special:Export jeder MediaWiki-Seite, darunter jede Wikimedia-Seite und Wikipedia, erstellt eine XML-Datei (Inhaltsdump). Siehe Meta:Daten-Dumps und Handbuch:dumpBackup.php. XML-Dateien werden auf Meta:Hilfe:Export genauer erklärt.
Wie importiert man?
Es gibt mehrere Methoden, um diese XML-Dateien zu importieren.
Mit Spezial:Import
Special:Import kann von Wiki-Benutzern mit dem Recht import genutzt werden (standardmäßig sind dies Benutzer in der Gruppe sysop), um eine kleine Anzahl von Seiten zu importieren (etwa 100 sollten sicher sein).
Der Versuch, größere Dumps auf diese Weise zu importieren, kann zu Timeouts oder Verbindungsfehlern führen.
- Siehe Hilfe:Import für eine grundlegende Beschreibung, wie der Importprozess funktioniert.[1]
Du wirst gebeten, ein Interwiki-Präfix anzugeben.
Wenn du beispielsweise aus der englischen Wikipedia exportiert hast, musst du 'en' eingeben.
XML-Import erfordert die Berechtigungen import und importupload.
Siehe Manual:Benutzerrechte.
Große XML-Uploads
Große XML-Uploads können abgelehnt werden, da sie das in der Datei php.ini festgelegte PHP-Upload-Limit überschreiten.
; Maximal zulässige Größe für hochgeladene Dateien.
upload_max_filesize = 20M
Versuche, diese vier Einstellungen in php.ini zu ändern:
; Maximale Größe von POST-Daten, die PHP akzeptiert.
post_max_size = 20M
max_execution_time = 1000 ; Maximale Ausführungszeit jedes Skripts in Sekunden
max_input_time = 2000 ; Maximale Zeitspanne, die jedes Skript für das Parsen von Anfragedaten aufwenden darf
; Standard-Zeitüberschreitung für socketbasierte Streams (Sekunden)
default_socket_timeout = 2000
Mit Hilfe von importDump.php, falls du Shell-Zugriff hast
- Empfohlene Methode für die allgemeine Verwendung, aber langsam bei sehr großen Datensätzen.
- Siehe: Handbuch:ImportDump.php, enthält Tipps zur Nutzung für große Wikis.
Mit Hilfe des Wartungsskript importTextFiles.php
| MediaWiki Version: | ≤ 1.23 |
| MediaWiki Version: | ≥ 1.27 |
Wenn du viele Inhalte aus einer anderen Quelle konvertiert hast (mehrere Textverarbeitungsdateien, Inhalte aus einem anderen Wiki, etc.), hast du vielleicht mehrere Dateien, die du in dein Wiki importieren möchtest. In MediaWiki 1.27 und später kannst du das Wartungsskript importTextFiles.php nutzen.
Du kannst auch das Wartungsskript edit.php für diesen Zweck nutzen.
rebuildall.php
Für große XML-Dumps kannst du rebuildall.php ausführen, es wird allerdings lange brauchen, da es alle Seiten parsen muss.
Dies wird für große Datensätze nicht empfohlen.
Nutzung von pywikibot, pagefromfile.py und Nokogiri
pywikibot ist eine Sammlung von Werkzeugen in Python, die die Arbeit in Wikipedia oder anderen MediaWiki-Seiten automatisieren. Nachdem du es auf deinem Computer installiert hast, kannst du das Werkzeug pagefromfile.py nutzen, das dich eine Wiki-Datei in Wikipedia oder anderen MediaWiki-Seiten hochladen lässt. Die von dumpBackup.php erstellte XML-Datei kann in eine Wiki-Datei umgewandelt werden, die von pagefromfile.py mithilfe eines einfachen Skripts in etwas wie das folgende umgewandelt werden kann (hier wandelt das Programm alle XML-Dateien um, die sich im aktuellen Verzeichnis befinden, was erforderlich ist, wenn deine MediaWiki-Seite eine Familie ist):
In Python
from pathlib import Path
from lxml import etree
import re
from pywikibot import Link, Site
""" The exported XML preserves local namespace names. To import into a project in another language,
you need to convert them to canonical names. Otherwise the pages will be imported as originals
without recognizing their namespace.
XML contains namespace numbers, but mapping them can be problematic. Because they can differ between projects.
For example, in ru.wikisource NS Page is number 104, while in uk.wikisource it is 252.
To solve these, the Link() class from pywikibot is used.
The Link() required the language code and family of project. XML does not contain these as separate
values. Instead, they are in another format, like `enwikisource` or 'commonswiki', which needs to be parsed.
"""
xml_folder = 'PATH_TO_XML_DUMP'
for xml_file in Path(xml_folder).glob('*.xml'):
root = etree.parse(xml_file).getroot()
ns = {'': root.nsmap[None]} # xml namespace
# Parsing language code and family of the project
dbname = root.find('.//siteinfo/dbname', ns).text
m = re.search(r'^(\w+?)(wiki|wikisource|wikiquote|wikinews|wikibooks)$', dbname)
if m:
site = Site(code=m.group(1), fam=m.group(2))
elif 'commons' in dbname:
site = Site('commons')
elif 'mediawikiwiki' in dbname:
site = Site('mediawiki')
else:
print("Site didn't recognized.")
break
wiki = []
for page in root.findall('.//page', ns):
title_source = page.find('title', ns).text
title = Link(title_source, site).ns_title().replace(' ', '_')
revision_id = page.find('.//revision/id', ns).text
print(f'{title}, revision id: {revision_id}')
text = page.find('.//revision/text', ns).text
wiki.append("{{-start-}}\n'''%s'''\n%s\n{{-stop-}}" % (title, text))
Path(f'out_{xml_file.stem}.wiki').write_text('\n'.join(wiki))
In Ruby
# -*- coding: utf-8 -*-
# dumpxml2wiki.rb
require 'rubygems'
require 'nokogiri'
# Dieses Programm dumpxml2wiki liest MediaWiki-XML-Dateien ein, die von dumpBackup.php im aktuellen Verzeichnis erstellt wurden, und wandelt sie in Wiki-Dateien um, die anschließend von pywikipediabot mithilfe von pagefromfile.py bearbeitet und wieder auf einer MediaWiki-Seite hochgeladen werden können.
# Der Text jeder Seite wird mittels XPath durchsucht und ihr Titel in der ersten Zeile als HTML-Kommentar hinzugefügt: dies wird von pagefromfile.py vorausgesetzt.
#
Dir.glob("*.xml").each do |filename|
input = Nokogiri::XML(File.new(filename), nil, 'UTF-8')
puts filename.to_s # prints the name of each .xml file
File.open("out_" + filename + ".wiki", 'w') {|f|
input.xpath("//xmlns:text").each {|n|
pptitle = n.parent.parent.at_css "title" # searching for the title
title = pptitle.content
f.puts "\n{{-start-}}<!--'''" << title.to_s << "'''-->" << n.content << "\n{{-stop-}}"
}
}
end
Als Beispiel ist hier ein Auszug aus einer Wiki-Datei-Ausgabe des Kommandos 'ruby dumpxml2wiki.rb' (zwei Seiten können dann von pagefromfile.py hochgeladen werden, eine Vorlage und eine zweite Seite, die eine Weiterleitung ist):
{{-start-}}<!--'''Template:Lang_translation_-pl'''--><includeonly>Tłumaczenie</includeonly>
{{-stop-}}
{{-start-}}#REDIRECT[[badania demograficzne]]<!--'''ilościowa demografia'''-->
<noinclude>
[[Category:Termin wielojęzycznego słownika demograficznego (pierwsze wydanie)|ilościowa demografia]]
[[Category:Termin wielojęzycznego słownika demograficznego (pierwsze wydanie) (redirect)]]
[[Category:10]]</noinclude>
{{-stop-}}
Das Programm greift auf jede XML-Datei zu, extrahiert die Texte innerhalb der Tags <text> </text> auf jeder Seite, sucht nach dem entsprechenden Titel und schließt ihn mit den Kommandos {{-start-}}<!--'''Titel der Seite'''--> {{-stop-}} ein, die von 'pagefromfile' genutzt werden, um eine Seite zu erstellen oder zu aktualisieren. Der Name der Seite ist ein HTML-Kommentar und durch drei Anführungszeichen in der ersten Zeile abgetrennt. Bitte beachte, dass der Name der Seite in Unicode geschrieben sein kann. Manchmal ist es wichtig, dass die Seite direkt mit dem Kommando beginnt, wie für #REDIRECT; daher muss sich der Name der Seite hinter dem Kommando, aber weiterhin in der ersten Zeile befinden.
Bitte denke daran, dass die von dumpBackup.php erzeugten XML-Dump-Dateien einen Namensraum als Präfix haben:
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/">
Um auf den Textknoten mit Nokogiri zuzugreifen, musst du deinem Pfad das Präfix 'xmlns' hinzufügen:
input.xpath("//xmlns:text")
Nokogiri ist ein HTML-, XML-, SAX- und Reader-Parser mit der Möglichkeit, Dokumente über XPath- oder CSS3-Selektoren der letzten Generation von XML-Parsern mit Ruby zu durchsuchen.
Beispiel für die Nutzung von 'pagefromfile' zum Hochladen der ausgegebenen Wikitext-Datei:
python pagefromfile.py -file:out_filename.wiki -summary:"Reason for changes" -lang:pl -putthrottle:01
Wie importiert man Protokolle?
Das Exportieren und Importieren von Logbüchern mit den standardmäßigen MediaWiki-Skripten ist häufig schwierig; eine Alternative für den Import ist das Skript pages_logging.py im Werkzeug WikiDAT, wie von Felipe Ortega vorgeschlagen.
Fehlerbehebung
Versionsgeschichten vereinen, Versionskonflikte, Bearbeitungszusammenfassungen und andere Komplikationen
Beim Importieren einer Seite mit Informationen zur Versionsgeschichte ändere bitte den Benutzernamen in der XML-Datei, falls dieser im Zielprojekt bereits existiert, um Verwirrung zu vermeiden. Falls der Benutzername im Zielprojekt neu ist, bleiben die Beiträge weiterhin verfügbar, es wird jedoch kein Konto automatisch erstellt.
Wenn eine Seite über einen Link oder eine URL referenziert wird, werden generische Namensraumbezeichnungen automatisch umgewandelt.
Wenn das Präfix kein anerkannter Namensraumname ist, fällt die Seite standardmäßig auf den Hauptnamensraum zurück.
Präfixe wie mw: können jedoch in Projekten ignoriert werden, die sie für Interwiki-Verlinkungen verwenden.
In solchen Fällen kann es vorteilhaft sein, das Präfix in der XML-Datei vor dem Import in "Project:" zu ändern.
Wenn bereits eine Seite mit demselben Namen existiert, werden beim Import der Versionen deren Versionsgeschichten zusammengeführt. Das Einfügen einer Version zwischen zwei vorhandenen Versionen kann dazu führen, dass die Änderungen des nächsten Benutzers anders erscheinen. Um die tatsächliche Änderung zu sehen, vergleiche die beiden ursprünglichen Versionen, nicht die eingefügte. Füge daher nur Versionen ein, um die Versionsgeschichte ordnungsgemäß wiederherzustellen.
Eine Version wird nicht importiert, wenn bereits eine Version mit demselben Datum und derselben Uhrzeit existiert. Dies geschieht üblicherweise, wenn sie bereits zuvor importiert wurde, entweder in das aktuelle oder ein früheres Wiki oder beides, möglicherweise von einer dritten Seite.
Eine Bearbeitungszusammenfassung kann auf eine andere Seite verweisen oder diese verlinken, was verwirrend sein kann, wenn die verlinkte Seite nicht importiert wurde, selbst wenn die verweisende Seite importiert wurde.
Die Bearbeitungszusammenfassung gibt nicht automatisch an, ob die Seite importiert wurde, im Falle eines Importuploads kannst du diese Information jedoch vor dem Import zu den Bearbeitungszusammenfassungen in der XML-Datei hinzufügen. Dies kann dazu beitragen, Verwirrung zu vermeiden. Wenn du die XML-Datei mittels Suchen und Ersetzen bearbeitest, beachte bitte, dass das Hinzufügen von Text zu den Bearbeitungszusammenfassungen eine Unterscheidung zwischen Bearbeitungen mit und ohne Bearbeitungszusammenfassung erfordert. Falls sich mehrere Kommentar-Tags in der XML-Datei befinden, wird nur der letzte Satz angewendet.
Interwikis
Wenn du die Nachricht Interwiki erhältst, ist das Problem, dass manche der zu importierenden Seiten ein Präfix haben, das für die Interwiki-Verlinkung genutzt wird.
Zum Beispiel würde das Präfix 'Meta:' in Konflikt mit dem Interwiki-Präfix meta: stehen, das standardmäßig auf https://meta.wikimedia.org verlinkt.
Du kannst eines der folgenden Dinge tun.
- Das Präfix aus der interwiki-Tabelle entfernen. Dadurch wird der Seitentitel erhalten, die Interwiki-Verlinkung über dieses Präfix allerdings verhindert.
- Beispiel: Du behältst Seitentitel wie 'Meta:Bla bla', kannst jedoch das Präfix 'meta:' nicht nutzen, um auf meta.wikimedia.org zu verlinken (obwohl es über ein anderes Präfix möglich wäre).
- Wie man es macht: Führe vor dem Importieren des Dumps die Abfrage
DELETE FROM interwiki WHERE iw_prefix='prefix'aus (Hinweis: Gib imprefixnicht den Doppelpunkt an). Alternativ kannst du, wenn du die Bearbeitung der Interwikitabelle aktiviert hast, einfach auf Special:Interwiki gehen und den Link 'Löschen' auf der rechten Seite neben der Zeile, die zu dem Präfix gehört, anklicken.
- Ersetze vor dem Import das unerwünschte Präfix in der XML-Datei durch "Project:". Dadurch bleibt die Funktion des Präfix als Interlink erhalten, allerdings wird das Präfix in den Seitentiteln durch den Namen des Wikis ersetzt, in das sie importiert werden und es kann anstrengend sein, dies bei großen Dumps zu tun.
- Beispiel: Ersetze in der XML-Datei überall 'Meta:' durch 'Project:'. MediaWiki wird dann beim Import 'Project:' durch den Namen des Wikis ersetzen.
Siehe auch
- Handbuch:dumpBackup.php
- meta:Data dumps/Other tools
- Handbuch:Systemadministration
- Handbuch:Datei-Uploads konfigurieren – Kann beim Durchführen großer Importe praktisch sein
- Manual:Errors and Symptoms#Fatal error: Allowed memory size of nnnnnnn bytes exhausted .28tried to allocate nnnnnnnn bytes.29 – Einstellungen, die möglicherweise geändert werden müssen, wenn du große Importe durchführst
- Handbuch:importImages.php – für den Import von Bildern.
- Manual:Importing external content
- Manual:Importing Wikipedia infoboxes tutorial
Einzelnachweise
- ↑ Siehe Handbuch:XML-Importdateimanipulation in CSharp für ein Code-Beispiel in C#, bei dem eine XML-Importdatei manipuliert wird.