您在這裡

MediaWiki網站内容遷移到Drupal平台

James Qi 在 2016年4月8日 - 11:02 發表

  2010年前我們主要使用MediaWiki平台來建網站,2011年後改用更為通用的Drupal内容管理系統,新網站就用Drupal搭建,而老的Wiki網站就維持運行、管理留言等,兩個系統中可能有一部分相同的内容,都是獨立導入添加的。現在想把一個MediaWiki中用戶創建的頁面内容遷移到Drupal網站中,思路是從MediaWiki導出XML文件,變換為CSV格式,然後導入Drupal站,具體記錄如下:

  1. 獲取需要遷移内容的頁面标題:如果數量不多可以直接複制下來或者從分類頁、搜索結果、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 ;
  2. 導出XML文件:如果不超過5000頁,可以用[[特殊:導出頁面]],把标題列表複制到輸入框中,勾選“僅包含當前版本,而不是完整曆史”,不勾選“包含模闆”,勾選“另存為文件”,點擊按鈕“導出”就可以,如果頁面數量超過5000頁,可以分多次進行,也可以用maintenance/dumpBackup.php來進行,帶參數pagelist指定頁面列表文件;
  3. XML轉CSV文件:嘗試了直接在Drupal中用Feeds導入XML但不成功,就還是先轉為熟悉的CSV格式,辦法是自己編寫一段小程序xml2csv.php(程序例子見下面);
  4. 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);
?>

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。