首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在xml twig中添加属性

如何在xml twig中添加属性
EN

Stack Overflow用户
提问于 2013-07-08 17:58:25
回答 1查看 753关注 0票数 1

我是xml::Twig的新手。如何在具有特定vmerge计数的vmerge标记计数中添加属性和值?我该怎么开始呢?在这个过程中使用了什么逻辑?

到目前为止,我的脚本如下:

代码语言:javascript
复制
use XML::Twig;
my $XMLHandler = XML::Twig->new(TwigHandlers =>  {
    },
    pretty_print => 'indented',
);
$XMLHandler->parsefile("sample.xml");
$XMLHandler->print;

输入XML:

代码语言:javascript
复制
<xml>
    <table>
        <tr>
            <column><vmerge value="start"/></column>
            <column></column>
            <column></column>
            <column><vmerge value="start"/></column>
        </tr>
        <tr>
            <column><vmerge/></column>
            <column></column>
            <column></column>
            <column><vmerge/></column>
        </tr>
        <tr>
            <column><vmerge value="start"/></column>
            <column></column>
            <column></column>
            <column><vmerge/></column>
        </tr>
        <tr>
            <column><vmerge/></column>
            <column></column>
            <column></column>
            <column><vmerge/></column>
        </tr>
    </table>
</xml>

我需要输出如下所示:

代码语言:javascript
复制
<xml>
    <table>
        <tr>
            <column rowspan="2"></column>
            <column></column>
            <column></column>
            <column rowspan="4"></column>
        </tr>
        <tr>
            <column></column>
            <column></column>
            <column></column>
            <column></column>
        </tr>
        <tr>
            <column rowspan="2"></column>
            <column></column>
            <column></column>
            <column></column>
        </tr>
        <tr>
            <column></column>
            <column></column>
            <column></column>
            <column></column>
        </tr>
    </table>
</xml>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-08 20:18:18

我想这就是你想要的:

代码语言:javascript
复制
#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;
my $twig = XML::Twig->new( twig_handlers =>  { table => \&table, },
                           pretty_print => 'indented',
                         )
                    ->parse(\*DATA)
                    ->print;

sub table
  { my( $t, $table)= @_;
    foreach my $vmerge ( $table->descendants( 'vmerge[@value="start"]'))
      { my $span=1;
        my $start_column= $vmerge->parent;
        $vmerge->delete;
        my $column_index= scalar $start_column->prev_siblings( 'column');

        my $tr= $start_column->parent( 'tr')->next_sibling( 'tr');
        while( $tr)
          { my $cont_vmerge= $tr->child( $column_index)->first_child( 'vmerge[@value!="start"]');
            if( $cont_vmerge) { $span++; $cont_vmerge->delete; }
            else              { last;                          }
            $tr= $tr->next_sibling( 'tr');
          }
        $start_column->set_att( rowspan => $span);
      }
  }

__DATA__
<xml>
<table>
<tr>
<column><vmerge value="start"/></column>
<column></column>
<column></column>
<column><vmerge value="start"/></column>
</tr>
<tr>
<column><vmerge/></column>
<column></column>
<column></column>
<column><vmerge/></column>
</tr>
<tr>
<column><vmerge value="start"/></column>
<column></column>
<column></column>
<column><vmerge/></column>
</tr>
<tr>
<column><vmerge/></column>
<column></column>
<column></column>
<column><vmerge/></column>
</tr>
</table>
</xml>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17523827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档