niszetの日記

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

(R)xml2のツリー表示(メモ)

2種類。

xml2パッケージでタグの構造を見るには、xml2::xml_structure()を使いますが、これはcatしているのでその文字列を再利用できない点が残念。

以前、data.treeパッケージで木構造のデータの表示を確かめていたのでxml2でも出来るはずと思って確認。ちょっとハマったのでメモ。xml_structre()の方も表示される文字を得る方法を知ったのでそちらもメモ。

xml2のデータ、xml_nodexml_documentas.listで変換してはいけません。xml2パッケージ内にas_list()関数があるのでこれを使います。これを、data.tree::as.Node()に与えれば良いです。例えば次のように。

data.tree::as.Node(xml2::as_list(xml2::read_xml("docx/docProps/app.xml")))

結果は次のように(最初の10行だけ)

                      levelName
1  Root                        
2   °--Properties             
3       |--Template            
4       |--TotalTime           
5       |--Pages               
6       |--Words               
7       |--Characters          
8       |--Application         
9       |--DocSecurity         
10      |--Lines               

階層構造が図示されるのでちょっと見やすい。ただし、xml2::xml_structure()のような、タグが持っている属性の表示をしてくれないので注意。逆に不要ならこっちの方がシンプルかも。

xml2::structure()capture.output()に渡すと出力する文字列を受け取れます。また、sink()を使えばファイルに書き出せる。

x <- capture.output(xml2::xml_structure(xml2::read_xml("docx/docProps/app.xml")))

結果は

> x
 [1] "<Properties [xmlns, xmlns:vt]>" "  <Template>"                   "    {text}"                    
 [4] "  <TotalTime>"                  "    {text}"                     "  <Pages>"                     
 [7] "    {text}"                     "  <Words>"                      "    {text}"                    
[10] "  <Characters>"                 "    {text}"                     "  <Application>"   

単にdocumentに入れるだけなら不要かな…。文字列の前の空白の数を数えて階層構造を作れば…というのもありますが、それならxml_structure()の中を書き換えたほうが早いか…。使い分けですね。

docxの中身、構造を概観するために良い可視化方法がないか?を検討しています。もうちょっと検討するかな…。