1

我正在使用 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 &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 回答