2个稳定版本
1.0.1 | 2023年8月30日 |
---|---|
1.0.0 | 2023年8月29日 |
#2591 in 解析器实现
27KB
397 行
解析Mediawiki导出(重启)
解析Mediawiki导出的XML。
此模块解析从Mediawiki导出的XML导出,通过迭代器提供每个页面。这对于解析维基百科和其他维基媒体项目的导出非常有用。
注意
如果您需要解析从导出中提取的任何wiki文本,请使用crate Parse Wiki Text (crates.io)。正确解析wiki文本需要处理大量复杂且难以理解的情况。Parse Wiki Text自动处理所有这些情况,为您提供易于操作的清晰解析元素树。
限制
此模块仅解析包含每个页面一个版本的导出。这是在页面“特殊:导出”中启用“仅包括当前版本,不包括完整历史记录”选项时得到的结果,以及文件名以-pages-articles.xml.bz2
结尾的维基媒体导出。
此模块忽略siteinfo
元素,page
元素的每个子元素(除了ns
、revision
和title
),以及revision
元素内的每个元素(除了format
、model
和text
)。
在没有实际用例证明超越这些限制的必要性之前,它们将保持不变,以避免由想象中的需求驱动的过早设计。
示例
解析bzip2压缩文件,区分普通文章和其他页面。一个包含完整错误处理的运行示例在examples
文件夹中。
use parse_mediawiki_dump_reboot::schema::Namespace;
extern crate bzip2;
extern crate parse_mediawiki_dump_reboot;
fn main() {
let file = std::fs::File::open("example.xml.bz2").unwrap();
let file = std::io::BufReader::new(file);
let file = bzip2::bufread::MultiBzDecoder::new(file);
let file = std::io::BufReader::new(file);
for result in parse_mediawiki_dump_reboot::parse(file) {
match result {
Err(error) => {
eprintln!("Error: {}", error);
break;
}
Ok(page) => if page.namespace == Namespace::Main && match &page.format {
None => false,
Some(format) => format == "text/x-wiki"
} && match &page.model {
None => false,
Some(model) => model == "wikitext"
} {
println!(
"The page {title:?} is an ordinary article with byte length {length}.",
title = page.title,
length = page.text.len()
);
} else {
println!("The page {:?} has something special to it.", page.title);
}
}
}
}
依赖项
~1.6–2.3MB
~44K SLoC