- 動機
- XML::AtomはXML::LibXMLが使えないときにXML::XPathを使ってパースしてくれるんだけど、XML::XPathの時の挙動を調べたい。
- やってみた
- XML::AtomのBEGINブロックでeval{ require XML::LibXML }してチェックしてる
- どこかでXML::LibXMLを殺せばいいんだけどどこに割り込めばいいのか分からない
- #soozyで教えてもらった。
- gfx: sub XML::LibXML::bootstrap{ die } require XML::Atom; でどうでしょう。
- おおおお!
- gfx: でもXML::LibXMLがXSLoader使うようになったらまた別の手を使わないとだめですよ。
- この場合うまくいくけど、汎用性がない、ということですね。
- lestrrat: @INCに sub { die if $_[0] eq ‘XML::LibXML’ } 的なものをしこんでおくのは?
- よくわからなかったので教えてもらった。
- http://gist.github.com/178271
- うまくいった!
- gfx: sub XML::LibXML::bootstrap{ die } require XML::Atom; でどうでしょう。
- ということで、下のスクリプトを動かすとXML::XPathで動いていることが分かる。
use strict;
use warnings;
use Test::More;
BEGIN {
unshift @INC, sub {die if $_[1] eq 'XML/LibXML.pm'; return};
}
use XML::Atom::Entry;
my $xml = <<END;
<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://www.w3c.org/2005/Atom'
xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='"hoge"'>
</entry>
END
{
my $atom = XML::Atom::Entry->new(\$xml);
isa_ok $atom->elem, 'XML::XPath::Node::Element';
# my $etag = $atom->elem->getAttributeNS('http://schemas.google.com/g/2005', 'etag');
my $etag = $atom->elem->getAttribute('gd:etag');
is $etag, '"hoge"';
}
done_testing;
#soozyのみなさん、ありがとうございました!