2010年前我們主要使用MediaWiki平台來建網站,2011年後改用更為通用的Drupal内容管理系統,新網站就用Drupal搭建,而老的Wiki網站就維持運行、管理留言等,兩個系統中可能有一部分相同的内容,都是獨立導入添加的。現在想把一個MediaWiki中用戶創建的頁面内容遷移到Drupal網站中,思路是從MediaWiki導出XML文件,變換為CSV格式,然後導入Drupal站,具體記錄如下:
- 獲取需要遷移内容的頁面标題:如果數量不多可以直接複制下來或者從分類頁、搜索結果、DPL列表等地方複制,如果是同屬于一個分類且頁面比較多而又不超過5000條可以用[[特殊:導出頁面]]中的“從分類添加頁面”功能獲取标題,如果有成千上萬的頁面就可以用SQL命令直接從數據庫獲取,例如SELECT jinglepage.page_title FROM `jinglepage` join `jinglecategorylinks` on jinglepage.`page_id`= `jinglecategorylinks` . `cl_from` WHERE jinglecategorylinks.`cl_to`= '騙子号碼' and jinglepage.`page_namespace` = 0 ;
- 導出XML文件:如果不超過5000頁,可以用[[特殊:導出頁面]],把标題列表複制到輸入框中,勾選“僅包含當前版本,而不是完整曆史”,不勾選“包含模闆”,勾選“另存為文件”,點擊按鈕“導出”就可以,如果頁面數量超過5000頁,可以分多次進行,也可以用maintenance/dumpBackup.php來進行,帶參數pagelist指定頁面列表文件;
- XML轉CSV文件:嘗試了直接在Drupal中用Feeds導入XML但不成功,就還是先轉為熟悉的CSV格式,辦法是自己編寫一段小程序xml2csv.php(程序例子見下面);
- CSV導入Drupal站:使用Feeds模塊,設置導入策略、映射關系,就可以把CSV文件導入。
自己編寫的xml2csv.php主要内容如下:
<?php
/*
* xml to csv convert
* input example: *.xml
* input fields: from mediawiki: title, ns, id, revision etc.
* output example: *.csv
* output fields: title, body, tags
* james qi 2016-4-7
*/
//print $argc;
ini_set('memory_limit','1024M');
if ( isset( $argv[1] ) ) {
$xml_file_name = $argv[1];
} else {
print "please provide xml file name arg\n";
exit;
}
if ( isset( $argv[2] ) ) {
$limit = $argv[2];
} else {
$limit = -1;
}
$path_input = ".";
$name_input = $xml_file_name;
$path_output = $path_input;
$name_output = "$xml_file_name.csv";
$file_input = "$path_input/$name_input";
$file_output = "$path_output/$name_output";
$f_input = fopen($file_input,"r");
$f_output = fopen($file_output,"w");
$xml_array=simplexml_load_file($name_input); //将XML中的數據,讀取到數組對象中
$siteinfo = $xml_array->siteinfo;
$page = $xml_array->page;
//print_r($siteinfo);
//print_r($page);
$count = 0;
$head = "title\tbody\ttags";
fwrite( $f_output, "$head\n" );
foreach($xml_array as $key=>$tmp){
if ($key == 'siteinfo') continue;
$count++;
$title = $tmp->title;
$ns = $tmp->ns;
$id = $tmp->id;
$revision = $tmp->revision;
$revision_id = $revision->id;
$revision_timestamp = $revision->timestamp;
$revision_text = $revision->text;
echo "count=$count, title=$title, revision_timestamp=$revision_timestamp\n";
$body = str_replace('<!--請在下面補充騙術細節-->{{騙子号碼提示}}{{号碼頁面頂部}}','',$revision_text);
$body = str_replace('<!--請在上面補充騙術細節-->{{号碼頁面底部}}<!--不要删除或者修改本行-->','',$body);
$body = str_replace('特殊:用戶貢獻/','',$body);
$body = str_replace('<!--不要删除或者修改本行-->','',$body);
$body = str_replace('“[[{{PAGENAME}}]]”','這',$body);
$output_line = "$title\t\"$body\"\t騙子曝光";
fwrite( $f_output, "$output_line\n" );
}
fclose ($f_input);
fclose ($f_output);
?>
评论