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); ?>
评论