我正在使用 XML::LibXML 来解析一大块 html,以更改所有锚元素的 title 属性。问题是 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 标签内的文本!