すべてのアンカー要素のタイトル属性を変更するために、XML::LibXML を使用して html のチャンクを解析しています。問題は、XML::LibXML がエンコードされていないエンティティを改ざんし、たとえば '&' を '&' に変更することです。href 属性の url パラメータで。
XML::LibXML にこれらのエンティティをエンコードまたはデコードしないようにするにはどうすればよいですか?
#!/usr/bin/perl -w
use strict;
use XML::LibXML;
my $parser = XML::LibXML->new(recover => 2);
my $html = '
<div>
<span>this & that & what?</span>
<a title="link1" href="http://url.com/foo?a=1&b=2">Link1</a>
<a title="link2" href="http://url.com/foo?a=1&b=2">Link2</a>
</div>';
my $doc = $parser->load_html(string => $html);
for my $node ($doc->findnodes('//*[@title]')) {
$node->setAttribute('title', 'newtitle');
}
print $doc->toString(), "\n";
__END__
次の出力が生成されます。
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>
<span>this & that & what?</span>
<a title="newtitle" href="http://url.com/foo?a=1&b=2">Link1</a>
<a title="newtitle" href="http://url.com/foo?a=1&b=2">Link2</a>
</div></body></html>
ご覧のとおり、XML::LibXML は URL を変更し、さらに span タグ内のテキストも変更しました!