Как конвертировать текст в XML с помощью Perl? - PullRequest
1 голос
/ 07 декабря 2010

входной текстовый файл содержит следующее:

....    
    ponies B-pro        
    were I-pro        
    used I-pro    
    A O        
    report O        
    of O    
    indirect B-cd        
    were O
    . O    
...

выходной XML-файл

<sen> 
 <base id="pro">
  <w id="1">ponies</w>
  <w id="2">were</w>
  <w id="3">were</w>
 </base>A report of 
 <base id="cd">indirect</base> were 
</sen>

я хочу создать XML-файл, прочитав текстовый файл, B- означает началоmy tag и I- означают слова включения внутри тега, а "O" означает вне базового тега, что означает, что он существует только в теге.

я пробую следующие коды:

#!/usr/local/bin/perl -w    
open(my $f, "input.txt") or die "Can't";    
open(my $o, ">output.xml") or die "Can't";    
my $c;   

sub read_line {     
  my $fh = shift;    
  if ($fh and my $line = <$fh>) {    
    chomp($line);    
 my @words = split(/\t/, $line);    
 my $word = $words[0];
     my $group = $words[1];    
 if($word eq "."){    
  return;    
 }    
 else{    
  if($group ne 'O'){    
   my @b = split(/\-/, $group);    
   if($b[0] eq 'B'){    
    my $e = "<e id=\"";              
    $e .= " . $b[1] . "\">";    
    $e .= $word . "</e>";
    return $e;    
   }   
   if($b[0] eq 'I'){    
    my $w = "<w id=\"";    
    $w .= $c . "\">";    
    $w .= $word . "</w>";    
    $c++;    
    return $w;    
   }    
  }    
  else{    
   $c = 2;    
   return $word;    
  }    
 }    
  }    
  return;    
}

sub get_text(){    
 my $txt = "";    
 my $r = read_line($f);     
 while($r){     
  if($r =~ m/[[:punct:]]/){    
   chop($txt);    
   $txt .= " " . $r . " ";    
  }    
  else{    
   $txt .= $r . " ";    
  }    
  $r = read_line($f);    
 }   
 chop($txt);    
 return "<sen>" . $txt . ".</sen>";    
}

вместо этого я получаю в качестве вывода:

<sen> 
 <base id="pro"> ponies </base>
  <w id="2">were</w>
  <w id="3">were</w>
 A report of 
 <base id="cd">indirect</base> were 
</sen>

мне действительно нужна помощь.

Спасибо

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Как сказал Javs, вы хотите использовать модуль, а не делать это вручную. Для ваших целей, поскольку у вас смешанный контент, я рекомендую XML :: LibXML . Вот пример, который я сделал, чтобы проверить, что вы действительно можете смешивать контент, как у вас:

use XML::LibXML;

my $doc = XML::LibXML::Document->new();

my $root = $doc->createElement('html');
$doc->setDocumentElement($root);
my $body = $doc->createElement('body');
$root->appendChild($body);

my $link = $doc->createElement('a');
$link->setAttribute('href', 'http://google.com');
$link->appendText('Google');
$body->appendChild($link);

$body->appendText('Inline Text');

print $doc->toString;
1 голос
/ 07 декабря 2010

Написание XML «от руки» только доставит вам неприятности.Используйте модуль из CPAN .

В вашем случае я бы сначала поместил данные в правильную структуру данных Perl (возможно, хэш, содержащий несколько массивов или что-то подобное), а затем использовал бымодуль (т. е. XML :: Simple для начинающих) для вывода в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...