如何以编程方式通过XML::Twig添加实体声明?
就我个人而言,我无法理解用于实体处理的XML::Twig文档 我用HTML::Tidy生成了一些XML。电话如下:如何以编程方式通过XML::Twig添加实体声明?,xml,perl,xml-twig,xml-entities,Xml,Perl,Xml Twig,Xml Entities,就我个人而言,我无法理解用于实体处理的XML::Twig文档 我用HTML::Tidy生成了一些XML。电话如下: my $tidy = HTML::Tidy->new({ 'indent' => 1, 'break-before-br' => 1, 'output-xhtml' => 0, 'output-xml' => 1, 'char-encoding' => 'raw', }
my $tidy = HTML::Tidy->new({
'indent' => 1,
'break-before-br' => 1,
'output-xhtml' => 0,
'output-xml' => 1,
'char-encoding' => 'raw',
});
$str = "foo bar";
$xml = $tidy->clean("<xml>$str</xml>");
$twig->parse
行条形图出现在
上,但我不知道如何以编程方式添加
元素。我试过这样的方法:
my $entity = XML::Twig::Entity->new("nbsp", " ");
$twig->entity_list->add($entity);
$twig->parse($xml);
。。。但是没有快乐
请帮助=)也许有更好的方法,但下面的代码对我很有用:
my $filter = sub {
my $text = shift;
my $ascii = "\x{a0}"; # non breaking space
my $nbsp = ' ';
$text =~ s/$ascii/$nbsp/;
return $text;
};
XML::Twig->new( output_filter => $filter )
->parse_html( $xml )
->print;
使用严格;
使用XML::Twig;
我的$doctype='';
my$xml='foobar';
my$xTwig=XML::Twig->new();
$xTwig->safe_parse($doctype.$xml)或die“解析xml失败:$@”;
打印$xTwig->sprint();
在这种情况下,一个肮脏但高效的技巧是添加一个虚假的DTD声明
然后,执行解析的XML::Parser将假定该实体是在DTD中定义的,并且不会在其上呕吐
为了消除伪造的DTD声明,可以输出细枝的根。如果需要其他声明,请创建并替换当前声明:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $fake_dtd= '<!DOCTYPE head SYSTEM "foo"[]>'; # foo may not even exist
my $xml='<html>
<head>
<meta content="tidyp for Linux (v1.02), see www.w3.org" name="generator" />
<title></title>
</head>
<body>foo bar</body>
</html>';
XML::Twig->new->parse( $fake_dtd . $xml)->root->print;
#/usr/bin/perl
严格使用;
使用警告;
使用XML::Twig;
我的$fake\u dtd=''福甚至可能不存在
我的$xml文件
富吧
';
XML::Twig->new->parse($fake\u dtd.$XML)->root->print;
如果有编程方法,我对在XML上进行regexp解析有点犹豫。如果我找不到一个更“正确”的方法来完成它,我会保留这一点(谢谢)。这非常接近我(理想)想要的。它仍然依赖于文本操作(在我的代码中),而不是使用XML::Twig API处理文本数据,但我可以简单地使用它为传入数据声明一个标准DTD。向上投票支持实用性,这可能是公认的答案(在我摆弄它之后),我最终接受了这一最佳答案。最后我做了一些稍微不同的事情,但仍然是文本操作。这可能是最好的通用解决方案。
my $filter = sub {
my $text = shift;
my $ascii = "\x{a0}"; # non breaking space
my $nbsp = ' ';
$text =~ s/$ascii/$nbsp/;
return $text;
};
XML::Twig->new( output_filter => $filter )
->parse_html( $xml )
->print;
use strict;
use XML::Twig;
my $doctype = '<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html [<!ENTITY nbsp " ">]>';
my $xml = '<html><head><meta content="tidyp for Linux (v1.02), see www.w3.org" name="generator" /><title></title></head><body>foo bar</body></html>';
my $xTwig = XML::Twig->new();
$xTwig->safe_parse($doctype . $xml) or die "Failure to parse XML : $@";
print $xTwig->sprint();
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $fake_dtd= '<!DOCTYPE head SYSTEM "foo"[]>'; # foo may not even exist
my $xml='<html>
<head>
<meta content="tidyp for Linux (v1.02), see www.w3.org" name="generator" />
<title></title>
</head>
<body>foo bar</body>
</html>';
XML::Twig->new->parse( $fake_dtd . $xml)->root->print;