解析perl中文件的特定部分

时间:2018-01-31 09:35:21

标签: perl

我是perl的新手并且正在探索它

我有一个.xml文件,我希望得到它的一些部分。 每个部分以U|0|1|10.95|10.95|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A| V|0|1|12.65|12.65|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A| P|0|1|15.57|15.57|0|0|0|0| |0| |0| |N|N| |N| |10335790|1| | |Y|N/A| 开头和结尾。我想在他们之间获得内容

<field>

和输出我看起来如下

 <field>
    <address>20</address>
    <startat>0</startat>
    <size>8</size>
 <field>

 <field>
    <address>21</address>
    <startat>0</startat>
    <size>8</size>
<field>

我将如何提取文件的这一部分?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以通过查看文本来解决此问题,但使用XML解析器总是更安全。 CPAN中有许多优秀的Perl XML库。我喜欢的是XML::LibXML(请参阅here),它是libxml2的接口。它提供了很多可能性。使用XML::LibXML::XPathContext的功能我们可以做到:

#!/usr/bin/perl

use strict;
use warnings;

use XML::LibXML;

my $parser = XML::LibXML->new( recover => 1 );
my $xp = $parser->parse_string(<<'EndXML');
  <document>
    <field>
      <address>20</address>
      <startat>0</startat>
      <size>8</size>
    </field>

    <field>
      <address>21</address>
      <startat>0</startat>
      <size>8</size>
    </field>
  </document>
EndXML

if( $@ ) {
  die "Cannot parse XML\n";
}

foreach my $c ( $xp->findnodes('//field') ) {
  print $c->findnodes('.'), "\n";
}

输出:

<field>
      <address>20</address>
      <startat>0</startat>
      <size>8</size>
    </field>
<field>
      <address>21</address>
      <startat>0</startat>
      <size>8</size>
    </field>

一些评论:

  1. 选项recover => 1可能对解析损坏的XML文件很有用。它不会解决所有问题,但可能能解决其中的一些问题。如果你不想修理,请留空。使用recover => 2使修复无声。
  2. 此代码使用findnodes,其中XPath表达式。在这种情况下,//field会找到任何<field>标记。然后findnodes('.')将获得&#34;字段&#34;。
  3. 的全部内容