【问题标题】:How convert text into XML using perl?如何使用 perl 将文本转换为 XML?
【发布时间】:2010-12-06 23:04:53
【问题描述】:

输入文本文件包含以下内容:

....    
    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-表示我的标签的开头,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>

我真的需要帮助。

谢谢

【问题讨论】:

  • 不要试图通过将字符串组合在一起来生成 XML。使用适当的 XML 模块。
  • 你的问题有很多含糊之处——indirect 真的应该是直接在&lt;base id="cd"&gt; 中的文本,而不是&lt;w&gt;&lt;w&gt; ID 是否只是全局递增? (XML 禁止重复使用 ID)。如果我们在blah B-bar 之后立即看到blah I-foo 会发生什么(基本ID 不匹配)?我有一些工作代码,但如果没有这些问题的答案,我真的不能说它是正确
  • 给我看看,也许我能得到一些想法。谢谢
  • 单词 ID 只增加 'B-' 之后的下一个单词有 'I-' 并且如果第二列中的单词有 'O' 则重置为 2。每当我立即找到“B-”时,我都应该重置计数器。

标签: perl


【解决方案1】:

“手动”编写 XML 只会给您带来麻烦。使用来自CPAN 的模块。

在您的情况下,我会首先将数据放入适当的 Perl 数据结构(可能是包含一些数组或类似内容的哈希),然后使用模块(即 XML::Simple 对于初学者)输出到文件.

【讨论】:

  • XML::Simple 在这种情况下不起作用,因为输出包含混合内容
【解决方案2】:

正如 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;

【讨论】:

  • 非常感谢,这真的很有帮助。你知道我如何检测文本文件中的下一个单词是否有 I- 后缀或“O”。
  • 您可以尝试使用正则表达式和前瞻。
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 2015-04-11
  • 2012-02-08
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
相关资源
最近更新 更多