我是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>
我将如何提取文件的这一部分?
非常感谢任何帮助。
答案 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>
一些评论:
recover => 1
可能对解析损坏的XML文件很有用。它不会解决所有问题,但可能能解决其中的一些问题。如果你不想修理,请留空。使用recover => 2
使修复无声。findnodes
,其中XPath表达式。在这种情况下,//field
会找到任何<field>
标记。然后findnodes('.')
将获得&#34;字段&#34;。