Manual:Importing XML dumps/cs

Tato stránka popisuje metody pro import výpisů XML. XML dumpy (uložení) obsahují obsah wiki (stránky wiki se všemi jejich revizemi) bez dat souvisejících s webem. XML dump nevytváří úplnou zálohu databáze wiki, neobsahuje uživatelské účty, obrázky, protokoly úprav atd.

Stránka Special:Export libovolného webu MediaWiki, včetně webu Wikimedie a Wikipedie, vytvoří soubor XML (výpis obsahu). Viz meta:Výpisy dat a Manual:DumpBackup.php. Soubory XML jsou podrobněji vysvětleny na stránce Nápověda:Export.

Jak importovat?

Existuje několik metod pro import těchto XML výpisů.

Použití Special:Import

Uživatelé wiki s oprávněním import (ve výchozím nastavení se jedná o uživatele ve skupině sysop) mohou použít oprávnění Special:Import k importu malého počtu stránek (bezpečných by mělo být asi 100).

Pokus o import velkých výpisů tímto způsobem může vést k vypršení časového limitu nebo selhání připojení.

Budete požádáni o zadání prefixu interwiki. Pokud jste například exportovali z anglické Wikipedie, musíte zadat 'en'. Import XML vyžaduje oprávnění import a importupload. Podívejte se na stránku Příručka:Uživatelská práva.

Nahrávání velkých XML souborů

Nahrávání velkých XML souborů může být odmítnuto, protože překračuje limit nahrávání PHP nastavený v souboru php.ini.

 ; Maximální povolená velikost pro nahrávané soubory.
 upload_max_filesize = 20M

Zkuste změnit tato čtyři nastavení v php.ini:

 ; Maximální velikost POST dat, kterou PHP přijme.
 post_max_size = 20M

 max_execution_time = 1000  ; Maximální doba provádění každého skriptu v sekundách
 max_input_time = 2000	    ; Maximální doba, kterou může každý skript strávit analýzou dat požadavku

 ; Výchozí časový limit pro streamy založené na socketech (sekundy)
 default_socket_timeout = 2000

Použití importDump.php, pokud máte přístup k shellu

Doporučená metoda pro obecné použití, ale pomalá pro velmi velké datové sady.
Viz: Příručka:ImportDump.php, včetně tipů, jak jej použít pro rozsáhlé wiki.

Používání skriptu pro údržbu importTextFiles.php

Verze MediaWiki:
1.23
Verze MediaWiki:
1.27

Pokud máte velké množství obsahu převedeného z jiného zdroje (několik souborů textového editoru, obsah z jiné wiki atd.), můžete mít několik souborů, které byste chtěli do své wiki importovat. V MediaWiki 1.27 a novějších verzích můžete použít údržbový skript importTextFiles.php.

Pro tento účel můžete také použít skript pro údržbu edit.php.

rebuildall.php

Pro velké XML výpisy můžete spustit rebuildall.php, ale bude to trvat dlouho, protože musí analyzovat všechny stránky. Nedoporučuje se pro velké datové sady.

Používání pywikibota, pagefromfile.py a Nokogiri

pywikibot je kolekce nástrojů napsaných v Pythonu, které automatizují práci na Wikipedii nebo jiných stránkách MediaWiki. Po instalaci do počítače můžete použít specifický nástroj pagefromfile.py, který vám umožní nahrát soubor wiki na Wikipedii nebo weby MediaWiki. Soubor XML vytvořený příkazem dumpBackup.php lze transformovat do souboru wiki vhodného pro zpracování příkazem 'pagefromfile.py' pomocí jednoduchého skriptu podobného následujícímu (zde program transformuje všechny soubory XML, které se nacházejí v aktuálním adresáři, což je potřeba, pokud je váš web MediaWiki rodinou):

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'

# Tento program dumpxml2wiki čte soubory MediaWiki XML, které jsou uloženy v aktuálním adresáři pomocí dumpBackup.php, a transformuje je do souborů wiki, které pak může pywikipediabot upravit a znovu nahrát pomocí pagefromfile.py na rodinný web MediaWiki.
# Text každé stránky je prohledán pomocí XPath a její název je přidán na první řádek jako HTML komentář: to je vyžadováno souborem 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

Například zde je úryvek z wiki souboru, který je vygenerován příkazem 'ruby dumpxml2wiki.rb' (dvě stránky lze nahrát pomocí pagefromfile.py, jednu šablonu a druhou stránku, která je přesměrováním):

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

Program přistupuje ke každému souboru XML, extrahuje texty do <text> </text> značek každé stránky, vyhledá odpovídající název jako nadřazený a uzavře jej do dvojice příkazů {{-start-}}<!--'''Název stránky'''--> {{-stop-}}<nowiki>, které používá 'pagefromfile' k vytvoření nebo aktualizaci stránky. Název stránky je v html komentáři a je oddělen třemi uvozovkami na stejném prvním řádku. Upozorňujeme, že název stránky lze napsat v kódování Unicode. Někdy je důležité, aby stránka začínala přímo příkazem, například u <nowiki>#REDIRECT. Komentář udávající název stránky tedy musí být za příkazem, ale stále na prvním řádku.

Vezměte prosím na vědomí, že soubory s výpisem XML vytvořené funkcí dumpBackup.php mají předponu jmenného prostoru:

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/">

Abyste mohli přistupovat k textovému uzlu pomocí Nokogiri, musíte před cestu zadat předponu 'xmlns':

input.xpath("//xmlns:text")

Nokogiri je analyzátor HTML, XML, SAX a Readeru se schopností prohledávat dokumenty pomocí selektorů XPath nebo CSS3 z poslední generace analyzátorů XML používajících Ruby.

Příklad použití 'pagefromfile' k nahrání výstupního textového souboru wiki:

python pagefromfile.py -file:out_filename.wiki -summary:"Reason for changes" -lang:pl -putthrottle:01


Jak importovat protokoly?

Export a import protokolů pomocí standardních skriptů MediaWiki se často ukáže jako velmi obtížný. Alternativou pro import je skript pages_logging.py v nástroji WikiDAT, jak navrhl Felipe Ortega.

Řešení problémů

Slučování historií, konflikty revizí, souhrny úprav a další komplikace

Pokud při importu stránky s historickými informacemi již uživatelské jméno v cílovém projektu existuje, změňte jej v souboru XML, abyste předešli nejasnostem. Pokud je uživatelské jméno v cílovém projektu nové, příspěvky budou stále dostupné, ale účet nebude automaticky vytvořen.

Pokud je na stránku odkazováno prostřednictvím odkazu nebo adresy URL, generické názvy jmenných prostorů se automaticky převedou. Pokud prefix není rozpoznatelným názvem jmenného prostoru, stránka standardně použije hlavní jmenný prostor. Předpony jako "mw:" však mohou být ignorovány v projektech, které je používají pro propojení mezi wikinami. V takových případech může být užitečné změnit předponu v souboru XML na "Project:" před importem.

Pokud již stránka se stejným názvem existuje, import revizí sloučí jejich historie. Přidání revize mezi dvě existující revize může způsobit, že změny provedené dalším uživatelem budou vypadat odlišně. Chcete-li vidět skutečnou změnu, porovnejte dvě původní revize, nikoli tu vloženou. Takže vkládejte pouze revize, které správně obnoví historii stránky.

Revize nebude importována, pokud již existuje revize se stejným datem a časem. K tomu obvykle dochází, pokud byl již dříve importován, ať už do aktuální, předchozí wiki nebo do obou, případně ze třetího webu.

Souhrn úprav může odkazovat na jinou stránku nebo na ni odkazovat, což může být matoucí, pokud stránka, na kterou se odkazuje, nebyla importována, přestože odkazující stránka ano.

Souhrn úprav automaticky neindikuje, zda byla stránka importována, ale v případě importu při nahrání můžete tuto informaci přidat do souhrnů úprav v souboru XML před importem. To může pomoci předejít nejasnostem. Při úpravě souboru XML pomocí funkce najít/nahradit mějte na paměti, že přidání textu do souhrnů úprav vyžaduje rozlišení mezi úpravami se souhrnem úprav a bez něj. Pokud je v souboru XML více tagů komentářů, použije se pouze poslední sada.

Interwikiny

Pokud se zobrazí zpráva Interwiki , problém je v tom, že některé stránky, které se mají importovat, mají prefix, který se používá pro propojení s Interwiki . Například ty s prefixem 'Meta:' by mohly kolidovat s interwiki prefixem meta:, který standardně odkazuje na https://meta.wikimedia.org.

Můžete provést kteroukoli z následujících akcí.

  • Odeberte prefix z tabulky interwiki. Tím se zachovají názvy stránek, ale zabrání se propojení mezi wikinami pomocí daného prefixu.
    Příklad: Zachováte názvy stránek 'Meta:Bla bla', ale nebudete moci použít prefix 'meta:' k odkazu na meta.wikimedia.org (i když to bude možné pomocí jiného prefixu).
    Jak na to: před importem výpisu spusťte dotaz DELETE FROM interwiki WHERE iw_prefix='prefix' (poznámka: do předpony nevkládejte dvojtečku). Případně, pokud máte povolenou úpravu tabulky interwiki, můžete jednoduše přejít na Special:Interwiki a kliknout na odkaz 'Smazat' na pravé straně řádku patřícího k danému prefixu.
  • Před importem nahraďte nežádoucí prefix v XML souboru za "Project:". Tím se zachová funkčnost prefixu jako propojovacího odkazu, ale prefix v názvech stránek se nahradí názvem wiki, kam jsou importovány, což může být u velkých výpisů docela problematické.
    Příklad: v souboru XML nahraďte všechny 'Meta:' výrazem 'Project:'. MediaWiki poté během importu nahradí 'Project:' názvem vaší wiki.

Související odkazy

Poznámky pod čarou

  1. Viz Příručka:Manipulace s importními soubory XML v CSharpu s ukázkou kódu C#, která manipuluje s importním souborem XML.
Category:Import/Export/cs#Importing%20XML%20dumps/cs
Category:Import/Export/cs