調べたところLibXMLにも改行削除の機能はあるようだったが
ちゃんと動作するのはXML::LibXML::Readerだけだった。
Cではどうなのだろう。
ignore whitespcaeは正規表現の場合前回やったように
$str =~ s/[\n\t]//g;
あたりだろう。
タグとタグの間とかに不用意にスペースが入っているとは思えないので
「\s」とかまでいれるとテキストで意図的に入れたものまで削られる。
また汎用htmlなら「\r」もいるだろうが当座は動画サイト関連なので
まぁないだろうか。
perlのLibXMLマニュアルによるとXML::LibXML::Parserでは
$parser->keep_blanks(0);
とすると良さそうなのだがtoStringで削除されていないようだった。
XML::LibXML::Readerの方はマニュアルでもきっちりオプションがかかれていて
$reader = XML::LibXML::Reader->new( string =>$Str,no_blanks => 1);
とすると改行やタブは取り除かれる。
しかし実際nodeType3(テキスト)や1(タグ開始)で
単独処理するならばあまり意味はないし正規表現を使う方法との違いは少ない。
パース時の違いはnodeType14が挟まらなくなることで
決め打ちな処理がしやすいことだろうか。
ところで上記方法だが
$reader = XML::LibXML::Reader->new( DOM =>$doc,no_blanks => 1);
だとホワイトスペースを取り除いてくれない。
$reader = XML::LibXML::Reader->new( string =>$doc->toString,no_blanks => 1);
とする必要がある。
事前処理をしてXML処理をするとよいか
XML処理をしてから正規表現で処理をするとよいか
ということになりそうだがテキスト描画とかはタグを残しておきたい部分もあるので
結局両方ということになりそうだ。
ことhtmlのパースについてはclassがnodeみたいなものだが
閉じタグが一様にdivかspanかaなので正規表現での組での変換は難しいから
機械的に処理しやすいxmlに変換する方法を検討したほうが良さそうだ。
なんか小ネタのみだが結構時間かかった。