niszetの日記

細かい情報を載せていくブログ

(R) xml2::xml_structure() が便利だった

コミケが終わったので技術書典に向けて走り始めます。

次回は無謀にもWordのスタイルの話をしたいと考えていますが、そのためにはまずWordをxmlに分解してその中身を見ていかねばなりません。

私が一番手馴れているのがR言語なので、xml2パッケージを使ってサクッとみていこう…と思ったのが読みの甘さ。XMLの構造は厄介ですね…(それでもR言語xml2パッケージのおかげでかなり楽に見れていると思いますが)

深さも項目も不明。。。

OOXMLの仕様を完全に理解しているわけではないので、スタイルを指定しているxmlファイルの構造がわかっていません。基本的にはxml_children()lengthが非0であれば子要素がいるということで探索すればよいのですが、タグが存在するだけで意味をなすもの、attrを与えることで意味があるものとあり、attrのkeyも要素ごとに異なります。まぁvalだけ見ておけばいいかなって結論になりつつありますが…。

そんなとき、ひとまず構造だけ押さえておきたいという場合は、xml2::xml_structure()を使うと良いです。

f:id:niszet:20200101232142p:plain

これはとあるWordファイルからstyle.xmlを抜き出し、その中のstyleタグでtypeがparagraphのものだけを選択してからxml_structureに与えたものです。注意すべきは、これはcatと同じく標準出力に文字を吐き出す関数になっているので、これの返り値を変数に代入して使うということはできません。その代わり、for文の中においてもそのまま使える点は便利です。おそらくそういう使い方を想定しているのかな、と。インデントで要素の親子関係を示していて、[]でattrを示しています。

で、これで構造をある程度抑えておいて、処理を書けば見通しが良くなるのではと思います。まぁ実際は処理中にチェック入れておかないと、typoとかあると抜けるので何とも…って感じがしますが。

tibbleを使えば、dataframe中にdataframeを持つような構成ができますが、今回は人間が見てわかる表を作りたかったのでやっていません。が、処理の途中のデータの持ち方としてはその方が良かったのかなぁ…という気もしますが。

そんな中、作っている表が次のようなもの。

f:id:niszet:20200101232701p:plain

これは、Pandocが生成するテンプレートファイル中に存在するスタイルの情報をまとめようとした表です。ひとまずこのレベルまでは作れましたが、この下の階層を見るべきなのかを思案中(多分見ない)

完成したら別の記事にまとめるかもしれません。この記事としては、xml_structureが便利だという記録を残すことが目的なので。

久々のRの記事でした。今年はRも触っていきたいですね(すっかり忘れてしまいました)

では今年も、Enjoy!!

補足

xml2ライブラリのxml_structure()関数に関するマニュアルはこちら。helpでも同じものが見れますが。

xml2.r-lib.org