1

すべてのアンカー要素のタイトル属性を変更するために、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 &amp; 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 &amp; that &amp; what?</span>
    <a title="newtitle" href="http://url.com/foo?a=1&amp;b=2">Link1</a>
    <a title="newtitle" href="http://url.com/foo?a=1&amp;b=2">Link2</a>
</div></body></html>

ご覧のとおり、XML::LibXML は URL を変更し、さらに span タグ内のテキストも変更しました!

4

1 に答える 1

2
ご覧のとおり、XML :: LibXMLはURLと、spanタグ内のテキストを変更しました。

あなたは間違っています。URLは変更されませんでした。元のHTMLと生成されたHTMLの両方が同じURL(http://url.com/foo?a=1&b=2)を生成します。HTMLは異なりますが、表示されるテキストは異なります。

スパン内のテキストについても同じことが言えます。元のHTMLと生成されたHTMLの両方が同じURL(this & that & what?)を生成します。HTMLは異なりますが、URLは異なります。

私の知る限り、XML::LibXMLのtoStringエスケープする文字を制御する方法はありません。&amp;どうやら、 HTMLで技術的に必要とされていない場合でも、エスケープすることを選択しているようです。

どうしてですか?&「 」を逃がしても害はありません。

« this & that &amp; what?»と« this &amp; that &amp; what?»はHTMLで同じ意味です。

« href="http://url.com/foo?a=1&amp;b=2"»と« href="http://url.com/foo?a=1&b=2"»はHTMLで同じ意味です。

PS — HTMLを作成する場合は、を使用する必要があります。を使用する必要があり->toStringHTML()ます->toString()。後者はXMLを生成します。

于 2011-10-09T04:57:08.800 に答える