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