2010-12-06 12 views
1

入力テキストファイル、次が含まれています。私は、テキストファイルを読み込むことで、XMLファイルを作成したいperlを使ってテキストをXMLに変換するには?

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

、B-は私のタグの初めを意味し、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> 

は、私は本当に助けを必要としています。

ありがとうございました

+3

文字列を一緒にバッシングしてXMLを生成しようとしないでください。適切なXMLモジュールを使用してください。 – Quentin

+0

私を助けてください! – aliocee

+0

あなたの質問にはあいまいさがたくさんあります。「間接」は実際には ' 'を得る代わりに' 'の中のテキストであるはずですか? '' IDはグローバルに増加するだけですか? (XMLはIDの再利用を禁じます)。 'blah B-bar'の直後(ベースIDが一致しない)に' blah I-foo'と表示されるとどうなりますか?私はいくつかの作業コードを持っていますが、実際にはこれらの質問に答えることなく*正しい*と言うことはできません。 – hobbs

答えて

1

"手作業で" XMLを書くのは面倒です。 CPANのモジュールを使用してください。

あなたのケースでは、まずデータを適切なPerlデータ構造(いくつかの配列を含むハッシュ、または同様のもの)に入れてから、モジュール(つまりXML :: Simpleを使って)を使ってファイル。

+1

XML :: Simpleは出力に混合コンテンツが含まれているのでこの場合は機能しません – mirod

+0

どのモジュールが機能するのですか? – aliocee

1

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

ありがとう、これは本当に役立ちます。テキストファイルの次の単語にI接尾辞が付いているかどうか、または「O」があるかどうかをどのように検出できるか考えていますか? – aliocee

+0

正規表現をルックアヘッドで試してみるとよいでしょう。 – Weegee

関連する問題