Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以编程方式通过XML::Twig添加实体声明?_Xml_Perl_Xml Twig_Xml Entities - Fatal编程技术网

如何以编程方式通过XML::Twig添加实体声明?

如何以编程方式通过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', }

就我个人而言,我无法理解用于实体处理的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',
});

$str = "foo   bar";
$xml = $tidy->clean("<xml>$str</xml>");
$twig->parse
行条形图出现在
上,但我不知道如何以编程方式添加
元素。我试过这样的方法:

my $entity = XML::Twig::Entity->new("nbsp", "&#160;");
$twig->entity_list->add($entity);
$twig->parse($xml);
。。。但是没有快乐


请帮助=)

也许有更好的方法,但下面的代码对我很有用:

my $filter = sub {
    my $text  = shift;
    my $ascii = "\x{a0}";    # non breaking space
    my $nbsp  = '&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 &nbsp; 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  = '&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 "&#160;">]>';
my $xml = '<html><head><meta content="tidyp for Linux (v1.02), see www.w3.org" name="generator" /><title></title></head><body>foo &nbsp; 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 &nbsp; bar</body>
</html>';

XML::Twig->new->parse( $fake_dtd . $xml)->root->print;