2个稳定版本

1.0.1 2023年8月30日
1.0.0 2023年8月29日

#2591 in 解析器实现

MIT 许可证

27KB
397

Crates.io Crates.io Documentation Crates.io

解析Mediawiki导出(重启)

解析Mediawiki导出的XML。

此模块解析从Mediawiki导出的XML导出,通过迭代器提供每个页面。这对于解析维基百科和其他维基媒体项目的导出非常有用。

注意

如果您需要解析从导出中提取的任何wiki文本,请使用crate Parse Wiki Text (crates.io)。正确解析wiki文本需要处理大量复杂且难以理解的情况。Parse Wiki Text自动处理所有这些情况,为您提供易于操作的清晰解析元素树。

限制

此模块仅解析包含每个页面一个版本的导出。这是在页面“特殊:导出”中启用“仅包括当前版本,不包括完整历史记录”选项时得到的结果,以及文件名以-pages-articles.xml.bz2结尾的维基媒体导出。

此模块忽略siteinfo元素,page元素的每个子元素(除了nsrevisiontitle),以及revision元素内的每个元素(除了formatmodeltext)。

在没有实际用例证明超越这些限制的必要性之前,它们将保持不变,以避免由想象中的需求驱动的过早设计。

示例

解析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