Как добавить пробел между двумя элементами?
Я новичок в ветке xml, как я могу добавить пространство между двумя элементами в xml-twig?
Входные данные:
<xml>
<fig id="fig6_4">
<label><xref ref-type="page" id="page_54"/>[Figure 4]</label>
<caption>The Klein Sexual Orientation Grid</caption>
</fig>
</xml>
Автор сценария:
$xml_twig_content = XML::Twig->new(
twig_handlers => {
'fig' => \&figure,
},
);
$xml_twig_content->parsefile('sample.xml');
sub figure{
my ($xml_twig_content, $figure) = @_;
my @figchild = $figure->children;
foreach my $chid (@figchild){
if ($chid->name =~ /label/){
my $t = $chid->text;
$chid->set_inner_xml($t . ' ');
$chid->erase;
}
выход:
<xml>
<fig id="fig6_4">
[Figure 4] <caption>The Klein Sexual Orientation Grid</caption>
</fig>
</xml>
я нуждаюсь:
<xml>
<fig id="fig6_4">
<xref ref-type="page" id="page_54"/>[Figure 4] <caption>The Klein Sexual Orientation Grid</caption>
</fig>
</xml>
как я могу вставить пространство между двумя элементами.....
2 ответа
Решение
Я бы использовал обработчик на fig/label
, так как это единственный элемент, который необходимо изменить. Затем коду в обработчике необходимо добавить суффикс к элементу, а затем стереть тег:
XML::Twig->new( twig_handlers => { 'fig/label' => sub { $_->suffix( ' ')->erase; }});
Мне не совсем ясно, какова цель - ваш формат выходных данных не выглядит особенно желательным. Тем не менее, приведенного ниже примера должно быть достаточно для того, чтобы помочь вам. Здесь рассматриваются два момента:
- Эта "внешняя ссылка" отсутствует в вашем текущем выводе.
- Как добавить произвольный пробел (в основном содержимое PCDATA) в документ
В качестве примечания: раньше я не использовал XML::Twig; документация на самом деле довольно хорошая, если вы знакомы с концепциями XML.
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new(
twig_handlers => {
'fig' => \&figure
},
pretty_print => 'indented',
);
$twig->parse(do { local $/; <DATA> });
$twig->print;
sub figure {
my ( $twig, $figure ) = @_;
# Find all children of type label (would there really be more than 1??)
foreach my $label ($figure->children('label')) {
# Replace the label with its chidren nodes
$label->replace_with($label->cut_children);
# Find the caption and place 4 spaces before it
if (my $caption = $figure->first_child('caption')) {
my $some_whitespace = XML::Twig::Elt->new('#PCDATA' => ' ');
$some_whitespace->paste(before => $caption);
}
}
}
__DATA__
<xml>
<fig id="fig6_4">
<label><xref ref-type="page" id="page_54"/>[Figure 4]</label>
<caption>The Klein Sexual Orientation Grid</caption>
</fig>
</xml>