对于我的生活,我无法理解用于实体处理的 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>");
产生:
<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(可以理解)在
处出现 barfs。我想做一些转换,通过 XML::Twig 运行它:
my $twig = XML::Twig->new(
twig_handlers => {... handlers ...}
);
$twig->parse($xml);
$twig->parse
行 barfs 在
上,但我不知道如何添加
元素以编程方式。我试过这样的事情:
my $entity = XML::Twig::Entity->new("nbsp", " ");
$twig->entity_list->add($entity);
$twig->parse($xml);
...但没有快乐。
请帮忙=)
最佳答案
在这种情况下,一个肮脏但有效的技巧是添加伪造的 DTD 声明。
然后进行解析的 XML::Parser 将假定该实体是在 DTD 中定义的,并且不会拒绝它。
要摆脱虚假的 DTD 声明,您可以输出 Twig 的根。如果您需要不同的声明,请创建它并替换当前声明:
#!/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;
关于xml - 如何以编程方式通过 XML::Twig 添加实体声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3998513/