Manual:Importing XML dumps/de

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.

  • See Help:Import for a basic description of how the importing process works.[1]

Du wirst gebeten, ein Interwiki-Präfix anzugeben. Wenn du beispielsweise aus der englischen Wikipedia exportiert hast, musst du 'en' eingeben. XML importing requires the import and importupload permissions. Siehe Manual:Benutzerrechte.

Large XML uploads

Large XML uploads might be rejected because they exceed the PHP upload limit set in the php.ini file.

 ; Maximum allowed size for uploaded files.
 upload_max_filesize = 20M

Try changing these four settings in php.ini:

 ; Maximum size of POST data that PHP will accept.
 post_max_size = 20M

 max_execution_time = 1000  ; Maximum execution time of each script, in seconds
 max_input_time = 2000	    ; Maximum amount of time each script may spend parsing request data

 ; Default timeout for socket based streams (seconds)
 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 Ruby-Programms 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):

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

On Ruby

# -*- coding: utf-8 -*-
# dumpxml2wiki.rb

require 'rubygems'
require 'nokogiri'

# This program dumpxml2wiki reads MediaWiki xml files dumped by dumpBackup.php on the current directory and transforms them into wiki files which can then be modified and uploaded again by pywikipediabot using pagefromfile.py on a MediaWiki family site.
# The text of each page is searched with xpath and its title is added on the first line as an html comment: this is required by pagefromfile.py.
# 
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

When importing a page with history information, if the user name already exists in the target project, change the user name in the XML file to avoid confusion. If the user name is new to the target project, the contributions will still be available, but no account will be created automatically.

When a page is referenced through a link or a URL, generic namespace names are converted automatically. If the prefix is not a recognized namespace name, the page will default to the main namespace. However, prefixes like mw: might be ignored on projects that use them for interwiki linking. In such cases, it might be beneficial to change the prefix to "Project:" in the XML file before importing.

If a page with the same name already exists, importing revisions will combine their histories. Adding a revision between two existing ones can make the next user's changes appear different. To see the actual change, compare the two original revisions, not the inserted one. So, only insert revisions to properly rebuild the page history.

A revision won't be imported if there's already a revision with the same date and time. This usually happens if it's been imported before, either to the current, a previous wiki, or both, possibly from a third site.

An edit summary might reference or link to another page, which can be confusing if the page being linked to has not been imported, even though the referencing page has been.

The edit summary doesn't automatically indicate whether the page has been imported, but in the case of an upload import, you can add this information to the edit summaries in the XML file before the import. This can help prevent confusion. When modifying the XML file with find/replace, keep in mind that adding text to the edit summaries requires differentiating between edits with and without an edit summary. If there are multiple comment tags in the XML file, only the last set will be applied.

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 im prefix nicht 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

Einzelnachweise

  1. Siehe Handbuch:XML-Importdateimanipulation in CSharp für ein Code-Beispiel in C#, bei dem eine XML-Importdatei manipuliert wird.
Category:Import/Export/de#Importing%20XML%20dumps/de
Category:Import/Export/de