我正在阅读一个xml文件,并添加了一些额外的文本,但由于某些特殊字符会自动转换,因此我无法获得准确的文字。
我试试这个:
<book>
<book-meta>
<book-id pub-id-type="doi">1545</book-id>
<book-title>Regenerating <?tex?> the Curriculum</book-title>
</book-meta>
</book>
脚本:
use strict;
use XML::Twig;
open(my $out, '>', 'Output.xml') or die "can't Create stroy file $!\n";
my $story_file = XML::Twig->new(
twig_handlers => {
'book-id' => sub { $_->set_text('<?sample?>') },
keep_atts_order => 1,
},
pretty_print => 'indented',
);
$story_file->parsefile('sample.xml');
$story_file->print($out);
输出:
<book>
<book-meta>
<book-id pub-id-type="doi"><?sample?></book-id>
<book-title>Regenerating <?tex?> the Curriculum</book-title>
</book-meta>
</book>
我想输出为:
<book>
<book-meta>
<book-id pub-id-type="doi"><?sample?></book-id>
<book-title>Regenerating <?tex?> the Curriculum</book-title>
</book-meta>
</book>
如何在XML twig中转义此类字符。我尝试了set_asis
选项,但我无法让它工作。
答案 0 :(得分:2)
XML::Twig
正在为您正确插入字符串<?sample?>
,因为您要求添加PCDATA节点,并且<
必须在此类节点中替换为<
。但是你想要的是一个处理指令节点。
使用XML::Twig
插入此类节点的最简单方法是使用set_inner_xml
方法,该方法将解析字符串中的XML树片段并将其作为当前节点的内容插入。
如果您更换
$_->set_text('<?sample?>')
与
$_->set_inner_xml('<?sample?>')
然后你的代码应该做你想要的。我得到的输出是
<book>
<book-meta>
<book-id pub-id-type="doi"><?sample?></book-id>
<book-title>Regenerating <?tex?> the Curriculum</book-title>
</book-meta>
</book>
答案 1 :(得分:1)
<? ..... ?>
不是(部分)文本,而是处理指令。当您使用set_text
添加XML时,它会以文本形式处理,因此<
。
我自己并不熟悉XML::Twig
,但我认为您应该检查是否可以添加处理指令而不是文本。