1

xml twig は初めてですが、xml-twig の 2 つの要素の間にスペースを追加するにはどうすればよいですか?

入力:

<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つの要素の間にスペースを挿入できますか.....

4

2 に答える 2

2

目標が何であるかは正確にはわかりません-出力データ形式は特に望ましいものではありません。とはいえ、次の例で十分に理解を深めることができます。次の 2 点に対処します。

  1. その「xref」が現在の出力にありません。
  2. ドキュメントに任意の空白 (基本的には 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>
于 2012-12-26T10:04:43.307 に答える
2

fig/label変更する必要がある唯一の要素であるため、 でハンドラーを使用します。ハンドラーのコードは、要素の末尾に空白を追加し、タグを消去する必要があります。

XML::Twig->new( twig_handlers => { 'fig/label' => sub { $_->suffix( ' ')->erase; }});
于 2012-12-26T12:27:16.813 に答える