【问题标题】:How to generate sequence for an xml element using perl script如何使用 perl 脚本为 xml 元素生成序列
【发布时间】:2013-11-13 12:12:35
【问题描述】:

输入:

<h2>Chapter One</h2>    
<h2>Chapter Two</h2>    
<h2>Chapter Three</h2>    
<h2>Chapter Four</h2>

输出:我需要什么

<h2 id="1">Chapter One</h2>
<h2 id="2">Chapter Two</h2>
<h2 id="3">Chapter Three</h2>
<h2 id="4">Chapter Four</h2>

请帮助解决这个问题.. 谢谢

【问题讨论】:

    标签: xml perl


    【解决方案1】:

    快速正则表达式,

    perl -pe '($n)=/Chapter\s+([0-9]+)/; s|<h2\K| id="$n"|' file
    

    您也可以查看What's the best XML parser for Perl?

    【讨论】:

      【解决方案2】:

      我认为,如果您的所有输入 XML 都与您的示例一致,即非常简单,只包含元素,或者您之后只有少数文件需要验证,那么我认为上面的答案很好。一般来说,将 XML 作为文本处理是一件坏事。从本质上讲,它不是文本。它是高度结构化的。例如,如果编码很重要,会发生变化,例如,您肯定希望将其解析为 XML。

      我已经偏爱XML::Twig,因为可以选择流式传输(也可以构建 XML 树),这是一种更接近于您在此处看到的命令行编辑的解析样式。我处理大量数据。 XML::Twig 实际上非常易于使用,但在实现/配置方面的初始学习曲线可能需要一些研究工作。

      有些人更喜欢XML::Lib(设置更简单),它提供了更多 DOM 风格的风格,但应用于大型数据集的成本更高,并且对于非常大的文件更笨拙。从那里开始,各种模块变得不那么复杂了,XML::Simple

      同样,这在很大程度上取决于您的要求、数据大小、验证标准等。单行方法很快,但不是处理 XML 的最佳实践。

      可能的解决方案

      假设 -

      • 您的 XML 格式正确;也就是说,它有一个根元素。
      • 您的章节可能会扩展到大于您的某个数量 愿意打字。
      • 您不会有包含某种形式的小数/分数的章节值(One.One, 或一个半等)

      您可以使用 XML::Twig 和 Lingua::EN::Words2Nums

      所以,给定输入:

      <root>
         <h2>Chapter One</h2>
         <h2>Chapter Two</h2>
         <h2>Chapter Three</h2>
         <h2>Chapter Four</h2>
      </root>
      

      这段代码:

      use XML::Twig;
      use Lingua::EN::Words2Nums;
      
      my $twig = new XML::Twig( 
            twig_roots => { 'h2' => \&h2_handler },
            twig_print_outside_roots => 1);
      
      sub h2_handler { 
         my ($twig,$elt) = @_;
         my $engNum = $elt->trimmed_text;
         $engNum =~ s/^chapter\s([a-z]+)$/$1/i;
         my $num = words2nums("$engNum");
         if (defined($num) and $num=~/\d+/){
            $elt->set_att( id => $num);
          }else{
             # Whatever you do if some chapter number is not what's expected
          }
         $elt->flush;
      }
      
      $twig->parsefile(pathToYourFile);
      

      将输出:

      <root>
         <h2 id="1">Chapter One</h2>
         <h2 id="2">Chapter Two</h2>
         <h2 id="3">Chapter Three</h2>
         <h2 id="4">Chapter Four</h2>
      </root>
      

      【讨论】:

      • 这不是解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多