1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2018年10月31日 |
---|
#14 in #exported
19KB
250 行
解析 Mediawiki 数据
解析从 Mediawiki 导出的 XML 数据。
此模块解析 Mediawiki 导出的 XML 数据,通过迭代器提供每个页面。这对于解析来自 维基百科和其他 Wikimedia 项目 的数据非常有用。
注意
如果您需要解析从数据中提取的任何 wiki 文本,请使用 Parse Wiki Text 包(crates.io,Github)。正确解析 wiki 文本需要处理大量的复杂和反直观的情况。Parse Wiki Text 自动处理所有这些情况,为您提供易于操作的明确解析元素树。
限制
此模块仅解析包含每个页面单个修订版本的存档。这是在“仅包括当前修订版,而不是完整历史记录”选项启用时,从 Special:Export
页面获得的内容,以及从文件名以 -pages-articles.xml.bz2
结尾的 Wikimedia 存档获得的内容。
此模块忽略 siteinfo
元素,以及 page
元素的每个子元素(除 ns
、revision
和 title
外),以及 revision
元素内的每个元素(除 format
、model
和 text
外)。
在存在真正用例以证明超出这些限制的必要性之前,它们将保持原样,以避免由想象中的需求驱动的过早设计。
示例
解析一个 bzip2 压缩文件,区分普通文章和其他页面。在 examples
文件夹中有一个包含完整错误处理的运行示例。
extern crate bzip2;
extern crate parse_mediawiki_dump;
fn main() {
let file = std::fs::File::open("example.xml.bz2").unwrap();
let file = std::io::BufReader::new(file);
let file = bzip2::bufread::BzDecoder::new(file);
let file = std::io::BufReader::new(file);
for result in parse_mediawiki_dump::parse(file) {
match result {
Err(error) => {
eprintln!("Error: {}", error);
break;
}
Ok(page) => if page.namespace == 0 && 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);
}
}
}
}
依赖项
~5MB
~143K SLoC