niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R)xmlのツリー表示にhtmltidyパッケージが良さそう(メモ)

…が、表示できないタグもある…。

stylexパッケージ中ではxml2パッケージを使用してdocx中のxmlファイルを加工しています。標準の設定では存在しないタグが、MS Word上で設定を更新すると現れたりする(w:valの属性値が変わるだけであればいいんですがね…)ので、都度構造を確認しています。

xml2パッケージではxml_structure()xml_contents()で構造と内容を確認できます。

> xml_contents(xml)
{xml_nodeset (38)}
 [1] <w:docDefaults>\n  <w:rPrDefault>\n    <w:rPr>\n      <w:rFonts w ...
 [2] <w:latentStyles w:defLockedState="0" w:defUIPriority="0" w:defSem ...
 [3] <w:style w:type="paragraph" w:default="1" w:styleId="Normal">\n   ...
 [4] <w:style w:type="paragraph" w:styleId="BodyText">\n  <w:name w:va ...
 [5] <w:style w:type="paragraph" w:customStyle="1" w:styleId="FirstPar ...
 [6] <w:style w:type="paragraph" w:customStyle="1" w:styleId="Compact" ...
 [7] <w:style w:type="paragraph" w:styleId="Title">\n  <w:name w:val=" ...
 [8] <w:style w:type="paragraph" w:styleId="Subtitle">\n  <w:name w:va ...
 [9] <w:style w:type="paragraph" w:customStyle="1" w:styleId="Author"> ...
[10] <w:style w:type="paragraph" w:styleId="Date">\n  <w:name w:val="D ...
[11] <w:style w:type="paragraph" w:customStyle="1" w:styleId="Abstract ...
[12] <w:style w:type="paragraph" w:styleId="Bibliography">\n  <w:name  ...
[13] <w:style w:type="paragraph" w:styleId="Heading1">\n  <w:name w:va ...
[14] <w:style w:type="paragraph" w:styleId="Heading2">\n  <w:name w:va ...
[15] <w:style w:type="paragraph" w:styleId="Heading3">\n  <w:name w:va ...
[16] <w:style w:type="paragraph" w:styleId="Heading4">\n  <w:name w:va ...
[17] <w:style w:type="paragraph" w:styleId="Heading5">\n  <w:name w:va ...
[18] <w:style w:type="paragraph" w:styleId="Heading6">\n  <w:name w:va ...
[19] <w:style w:type="paragraph" w:styleId="Heading7">\n  <w:name w:va ...
[20] <w:style w:type="paragraph" w:styleId="Heading8">\n  <w:name w:va ...
...
> xml_structure(xml)
<styles [xmlns:r, xmlns:w]>
  <docDefaults>
    <rPrDefault>
      <rPr>
        <rFonts [asciiTheme, eastAsiaTheme, hAnsiTheme, cstheme]>
        <sz [val]>
        <szCs [val]>
        <lang [val, eastAsia, bidi]>
    <pPrDefault>
      <pPr>
        <spacing [after]>
  <latentStyles [defLockedState, defUIPriority, defSemiHidden, defUnhideWhenUsed, defQFormat, count]>
  <style [type, default, styleId]>
    <name [val]>
    <qFormat>
  <style [type, styleId]>
    <name [val]>
    <basedOn [val]>
    <link [val]>
    <pPr>
      <spacing [before, after]>
    <qFormat>
  <style [type, customStyle, styleId]>
# 以降省略

contentsの方ではすべての値が確認できるわけではない、structureの場合はcatしているらしく表示を抑制できない(headなどで最初の数行を見たいなどができない)など、不満があります。

で、xmlの構造をtree表示できないか?と調べていたところ、htmltidyパッケージを見つけました。

https://cran.r-project.org/web/packages/htmltidy/index.html

gitlab.com

この中で使いそうなのがxml_view()xml_tree_view()xml_tree_view()はViewer Paneに表示してくれます。

xml_tree_view(xml)

f:id:niszet:20200728100857p:plain

図中の[+]をクリックすることで畳んだり開いたりできます。ただし、タグによっては表示が出来ないような…?

xml_view()は対象のxml2のオブジェクトのタグ構造をViewer Paneに表示します。例えば次のように、xml2::xml_child()などで子要素を抜き出してから使うと便利そうです。

xml_view(xml2::xml_child(xml, "w:docDefaults"))

f:id:niszet:20200728093957p:plain

ただし、xml_nodesetの場合はうまく表示できないようです。

とりあえず見つけたので使ってみたというレベルなのでもう少し使ってみてより良い使い方がないかやってみようと思います。