2013-07-08 3 views
0

내가 xml::Twig에 새로운 오전 나뭇 가지. vmerge 태그의 속성 및 값을 추가하는 방법은 특히 vmerge과 함께 계산됩니까? 어떻게 시작할 수 있습니까? 이 과정에서 어떤 논리가 사용됩니까? 지금까지XML에 속성을 추가하는 방법

내 스크립트를

use XML::Twig; 
my $XMLHandler = XML::Twig->new(TwigHandlers => { 
    }, 
    pretty_print => 'indented', 
); 
$XMLHandler->parsefile("sample.xml"); 
$XMLHandler->print; 

입력 XML : 나는 다음과 같은 수의 출력을 필요

<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> 

:

<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> 
+0

입력에서 출력으로가는 방법을 알지 못합니다. 설명해 주시겠습니까? – mirod

+0

나는 그의 질문이 그것을하는 방법이라고 생각합니다. 출력이 원하는 출력 인 것 같습니다. – simbabque

+0

@simbabque 방금 알고리즘이 무엇인지 이해하지 못했습니다. 2 개의 문서를 검토 한 후에 이해할 수 있다고 생각합니다. 나는 그것을 찾는 내 시간을 보내는 대신 알고리즘을 설명하기 위해 OP가 필요합니다. – mirod

답변

3

나는 이것이 당신이 원하는 생각 :

#!/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> 
+0

대단히 감사합니다 .... 당신의 대답은 매우 환상적입니다 ... – user1811486

+0

나는 작은 의심이 있습니까? my $ cont_vmerge = $ tr-> child ($ column_index) -> first_child ('vmerge [@value! = "start"]'); 너무 좋은 일,하지만 좋은는 어떻게 거기에서 정확한 vmerge 태그를받을 수 있나요? 너 나 좀 도와 줄 수있어? – user1811486

+0

'first_child'를'first_descendant'로 바꿉니다. – mirod

관련 문제