我正在使用XML :: LibXML来解析一大块html,以便更改所有锚元素的title属性。 问题是XML :: LibXML篡改了未编码的entites,并改变了例如'&'到'& amp;'在href属性的url params中。
我如何告诉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已经更改了网址,以及span标记内的文字!
答案 0 :(得分:2)
正如您将看到的那样,XML :: LibXML已经更改了URL,以及span标记内的文本!
你错了。该网址未更改。原始HTML和生成的HTML都生成相同的URL(http://url.com/foo?a=1&b=2
)。 HTML不同,但显示的文字不是。
跨度中的文字也是如此。原始HTML和生成的HTML都生成相同的URL(this & that & what?
)。 HTML不同,但URL不是。
据我所知,没有办法控制XML :: LibXML的toString
转义的字符。显然,即使在HTML中技术上不需要它,它也会选择逃避&
。
为什么不呢? “&
”逃脱没有任何害处。
«this & that & what?
»和«this & that & what?
»在HTML中的含义相同。
«href="http://url.com/foo?a=1&b=2"
»和«href="http://url.com/foo?a=1&b=2"
»在HTML中的含义相同。
PS - 如果您要制作HTML,则应该使用->toStringHTML()
,而不是->toString()
。后者产生XML。