2009年07月15日

LibXMLでのignore whitespace

よくわからないので正規表現で改行とタブを削除してみたのだが
調べたところ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に変換する方法を検討したほうが良さそうだ。

なんか小ネタのみだが結構時間かかった。


posted by Xo_ox at 19:00| Comment(0) | perl | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。