读取xml文件并创建属性文件的perl脚本

读取xml文件并创建属性文件的perl脚本,perl,Perl,用于读取property.xml并创建install.properties文件的Perl脚本 如何读取多行并拆分keyName和keyValue #!/usr/bin/perl use strict; use warnings; open my $fh, '<', "property.xml" or die "property.xml: $!"; open(CTS,">install.properties") or die $!; while ( my $line = <

用于读取property.xml并创建install.properties文件的Perl脚本

如何读取多行并拆分keyName和keyValue

#!/usr/bin/perl
use strict;
use warnings;

open my $fh, '<', "property.xml"  or die "property.xml: $!";
open(CTS,">install.properties") or die $!;

while ( my $line = <$fh> ) {

if ($line =~ m/\<entry.*\<\/entry\>$/i ){     # how to read multiple line
my ($keyName, $keyValue) = split(//, $line);     # how to split 
print CTS $keyName = $keyValue;
}
}
尝试一下我最喜欢的“XML解析器”,以实现简单的XML处理。它将您的文件加载到一个随时可用的perl哈希/array of hash/array of…:-

use XML::Simple;
use Data::Dumper;

my $ref = XMLin('test.xml'); # load the file
print STDERR Dumper($ref);   # see how it looks
foreach my $k (keys %{$ref->{entry}}) # output to conf
{
    $v = $ref->{entry}->{$k}->{content};
    print "$k=$v\n";
}
效果很好:-

% perl test.pl

HOST=
    localhost

LOCATION=
    C:\Rel-LOCATION

TYPE=
    Rel
我已经为您留下了修剪等:)

尝试我一直最喜欢的“XML解析器”,以实现简单的XML处理。它将您的文件加载到一个随时可用的perl哈希/array of hash/array of…:-

use XML::Simple;
use Data::Dumper;

my $ref = XMLin('test.xml'); # load the file
print STDERR Dumper($ref);   # see how it looks
foreach my $k (keys %{$ref->{entry}}) # output to conf
{
    $v = $ref->{entry}->{$k}->{content};
    print "$k=$v\n";
}
效果很好:-

% perl test.pl

HOST=
    localhost

LOCATION=
    C:\Rel-LOCATION

TYPE=
    Rel

我已经为您留下了修剪等:)

我将使用XML::LibXML编写类似的代码

use strict;
use warnings;
use feature 'say';
use XML::LibXML;

# Parse the XML
my $xml = XML::LibXML->load_xml(location => 'test.xml');

# Iterate the entries
for my $entry ($xml->findnodes('/properties/entry')) {

    my $key = $entry->findvalue('@key');

    # trim the value
    s/\A\s*//, s/\s*\z// for my $value = $entry->textContent;

    say "$key = $value";
}
my$value=$entry->textContent的语句
s/\A\s*/,s/\s*\z//是

my $value = $entry->textContent;
$value =~ s/\A\s*//;
$value =~ s/\s*\z//;
替换完成修剪
\A
固定在字符串的开头,
\z
固定在字符串的结尾(大致相当于
^
$
分别)

say
功能自perl5 v10开始提供,并提供了
say
功能,其工作原理类似于
print
,但添加了换行符

简单的XPath表达式的工作方式与文件路径类似,但是
@key
选择一个属性

我在这里使用的各种DOM节点方法有:

  • findnodes
    –获取与XPath表达式匹配的节点列表
  • findvalue
    –获取与XPath匹配的节点,并返回文本值
  • textContent
    –返回文本节点的值

我会使用XML::LibXML编写类似的代码

use strict;
use warnings;
use feature 'say';
use XML::LibXML;

# Parse the XML
my $xml = XML::LibXML->load_xml(location => 'test.xml');

# Iterate the entries
for my $entry ($xml->findnodes('/properties/entry')) {

    my $key = $entry->findvalue('@key');

    # trim the value
    s/\A\s*//, s/\s*\z// for my $value = $entry->textContent;

    say "$key = $value";
}
my$value=$entry->textContent的语句
s/\A\s*/,s/\s*\z//是

my $value = $entry->textContent;
$value =~ s/\A\s*//;
$value =~ s/\s*\z//;
替换完成修剪
\A
固定在字符串的开头,
\z
固定在字符串的结尾(大致相当于
^
$
分别)

say
功能自perl5 v10开始提供,并提供了
say
功能,其工作原理类似于
print
,但添加了换行符

简单的XPath表达式的工作方式与文件路径类似,但是
@key
选择一个属性

我在这里使用的各种DOM节点方法有:

  • findnodes
    –获取与XPath表达式匹配的节点列表
  • findvalue
    –获取与XPath匹配的节点,并返回文本值
  • textContent
    –返回文本节点的值

以下是如何使用XML::Twig实现这一点,并加入了一些现代习惯用法:

#!/usr/bin/perl

use strict;
use warnings;

use autodie qw( open); # dies with error message when open fails

use XML::Twig;

my $IN= "properties.xml";
my $OUT= "install.properties";

open( my $cts, '>', $OUT); # avoid "bareword filehandles" (CTS), use 3 arg open

XML::Twig->new( twig_handlers => { entry => \&entry, },)
         ->parsefile( $IN);

sub entry
  { my( $t, $entry)= @_;
    print {$cts} $entry->att( 'key'), " = ", $entry->trimmed_text, "\n"; 
  } 

下面是如何使用XML::Twig实现这一点,并加入了一些现代习惯用法:

#!/usr/bin/perl

use strict;
use warnings;

use autodie qw( open); # dies with error message when open fails

use XML::Twig;

my $IN= "properties.xml";
my $OUT= "install.properties";

open( my $cts, '>', $OUT); # avoid "bareword filehandles" (CTS), use 3 arg open

XML::Twig->new( twig_handlers => { entry => \&entry, },)
         ->parsefile( $IN);

sub entry
  { my( $t, $entry)= @_;
    print {$cts} $entry->att( 'key'), " = ", $entry->trimmed_text, "\n"; 
  } 

那么问题是什么呢。这不是XML,否则它将有一个根元素。2.只需使用一个XML解析器,如,并通过XPath表达式提取信息。如果你有问题,请回来。回复:你的最新问题。您的问题可以通过使用正则表达式来解决,但这是一种非常糟糕的风格,很难正确执行。请使用XML解析器。这真的不难,而且可以用比当前代码更少的行完成!那么问题是什么呢。这不是XML,否则它将有一个根元素。2.只需使用一个XML解析器,如,并通过XPath表达式提取信息。如果你有问题,请回来。回复:你的最新问题。您的问题可以通过使用正则表达式来解决,但这是一种非常糟糕的风格,很难正确执行。请使用XML解析器。这真的不难,而且可以用比当前代码更少的行完成!,根据它自己的文件。(虽然在这样的情况下它是非常DWIM的,但在一般问题上使用它是非常困难的)。我不知道这一点。尽管如此,我还是让答案留在这里,希望能改进我的rep:),更不重要的是,即使在今天,我也会这样做,而不是在Parser.pm 186 eval{187$result=$expat->parse($arg)中的第3行第0列第44字节的文档元素后面使用msg junk失败; 188 };问题在于xml文件格式,它工作正常。根据它自己的文件,非常感谢Himanshu。(虽然在这样的情况下它是非常DWIM的,但在一般问题上使用它是非常困难的)。我不知道这一点。尽管如此,我还是让答案留在这里,希望能改进我的rep:),更不重要的是,即使在今天,我也会这样做,而不是在Parser.pm 186 eval{187$result=$expat->parse($arg)中的第3行第0列第44字节的文档元素后面使用msg junk失败; 188 };问题在于xml文件格式,它工作正常。非常感谢希曼殊