【おれの備忘録】はじめてのRust-XMLパースとスマートポインタのCow

actix-webではやくWebアプリを作りたいオウルです。あと、RustでWebAssembly したい。今回は、意外に使う頻度が多いXMLパースをRustで実装です。

Rustの学習にあたり、僕は公式ドキュメント以外に次の2冊の入門書を参考にしています。どちらも分かり易くおすすめです。この2冊が情報のソースとなっているところがあるので、後で分かり易いようにページ番号を残すようにします。


ローカル環境
language Rust 1.51.0
os WSL Ubuntu 21.04
editor VSCode

XMLパース

読み込むXMLは、Microsoftのドキュメントサンプルを少し加工したXMLを使用します。

roxmltree

crate registryのparserキーワードにあるRead-Onlyなroxmltreeをパーサーとして使用します。

パース

サンプルのXMLは、Windows環境下に保存してShift_JISとします。パースするにあたり、XMLファイルの中身を文字列として処理します。Rustでは文字列を扱うのに、&str(文字列スライス、借用)、String(文字列型、所有権あり)がよく使用され、これらはUTF-8エンコードされた文字列を取り扱います。

そこで[u8]型で格納されたバイト列をencoding_rsを使ってエンコーディング変換を行います。因みにencoding_rsは「実践Rustプログラミング入門」(P186)で紹介されていたクレートです。

ここは、どちらかというとroxmltreeの使い方がほとんどなので、使い方以外のポイントを書いておきます。

std::convert::AsRef

xml_parseメソッド定義のシグニチャを見てみると、前回の記事で紹介したstd::convert::AsRefを使用しています。

std::borrow::Cow

デコードの結果をstd::borrow::Cowというクローンオンライト スマートポインタで受け取っています。

std::borrow::Cowに詳しくExamples付きで説明がありますが、理解するところ、借用をラップして不変アクセスを可能にして、変更・所有権が必要な場合は遅延クローンする、ということでしょうか。因みに、Examplesにあるように、既に所有している場合はクローンされません。

ここでは、into_ownedでクローンして所有しています。余談ですが、into_ownedメソッド定義のシグネチャにあるフルパス記法が思い出せなかった。

Cowはstd::borrow::Borrowトレイトを介して一般的な借用データを処理するように設計されているようなので、std::borrow::Borrowトレイトの一歩踏み込んだ理解が必要かな。

次はパースした結果をCSVに出力することにチャレンジです。

カテゴリーRust

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA