我有一个xml文件(client_23.xml)
,其中我需要在特定部分添加几行,而不是其他xml文件(abc_lop.xml)
中的内容。
以下是我的abc_lop.xml
文件,其中您看到我有很多ClientField
行,其中包含name
,pptype
和dataType
。
<Hello version="100">
<DataHolder numberOfFields="67">
<ClientField name="target" pptype="aligning" dataType="string">
<Value value="panel_3646"/>
<Value value="panel_3653"/>
</ClientField>
<ClientField name="category_3652_0_count" pptype="symetrical" dataType="double"/>
<ClientField name="pme.age" pptype="symetrical" dataType="double"/>
<ClientField name="pme.gender" pptype="aligning" dataType="string">
<Value value=""/>
<Value value="F "/>
<Value value="NA"/>
</ClientField>
</DataHolder>
</Hello>
我需要阅读此文件并从name
行中提取ClientField
,如果pptype
不是aligning
,那么我需要为每个名称构建此行:下面是两个名称的示例,只有第一个值不同,除此之外,其他两个名称将始终相同。
<eval>upsert("category_3652_0_count", 0, $calty_doubles)</eval>
<eval>upsert("category_3652_2_count", 0, $calty_doubles)</eval>
现在,如果pptype
为aligning
,则构造如下所示的行:
<eval>upsert("target", "NA", $calty_strings)</eval>
<eval>upsert("pme.gender", "NA", $calty_strings)</eval>
我必须在client_23.xml
文件中进行所有这些更改,然后使用它创建一个新文件,以便我的新文件看起来像这样:我将有一个名为data_values
的函数其中我需要在<block>
标记中添加上述内容,如下所示。
<function>
<name>data_values</name>
<variables>
<variable>
<name>temp</name>
<type>double</type>
</variable>
</variables>
<block>
<eval>temp = 1</eval>
<eval>upsert("category_3652_0_count", 0, $calty_doubles)</eval>
<eval>upsert("category_3652_2_count", 0, $calty_doubles)</eval>
<eval>upsert("target", "NA", $calty_strings)</eval>
<eval>upsert("pme.gender", "NA", $calty_strings)</eval>
</block>
</function>
这是我目前在client_23.xml
文件中的内容,因此在添加之后,它将如上所示:
<function>
<name>data_values</name>
<variables>
<variable>
<name>temp</name>
<type>double</type>
</variable>
</variables>
<block>
<eval>temp = 1</eval>
</block>
</function>
我提出了下面的perl脚本,但每当我尝试运行它时,它都没有运行,我看到了一些错误:
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
# Open the main XML file and locate the
# <block> element that we need to insert into
#
my $doc = XML::LibXML->load_xml(
location => 'client_23.xml',
no_blanks => 1,
);
my $block = $doc->find('/function/block')->get_node(1);
# Open the secondary XML file and find all the <ClientField> elements
# that contain the data we need to insert
#
my $abc = XML::LibXML->load_xml(location => 'abc_lop.xml');
for my $field ( $abc->find('/Hello/DataHolder/ClientField')->get_nodelist ) {
my ($name, $pptype) = map $field->getAttribute($_), qw/ name pptype /;
my $text = $pptype eq 'aligning' ?
sprintf q{upsert("%s", "NA", $calty_strings)}, $name :
sprintf q{upsert("%s", 0, $calty_doubles)}, $name;
$block->appendTextChild('eval' , $text);
}
print $doc->toString(2);
我制作了perl脚本可执行文件并像这样运行它,我收到了一个错误。怎么了?
./tester.perl: line 1: use: command not found
./tester.perl: line 2: use: command not found
./tester.perl: line 4: use: command not found
./tester.perl: line 9: syntax error near unexpected token `('
./tester.perl: line 9: `my $doc = XML::LibXML->load_xml('
更新: -
现在修复了使用错误。我看到了这个错误:
Can't locate XML/LibXML.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at ./tester.perl line 5.
BEGIN failed--compilation aborted at ./tester.perl line 5.
我需要安装任何东西吗?
答案 0 :(得分:2)
Can't locate XML/LibXML.pm
因此您需要安装XML :: LibXML模块。尝试其中一个命令。
如果你有sudo
访问权限,并且在Debian Linux或Ubuntu上,请运行:
sudo apt-get install libxml-perl
如果你有sudo
访问权限并且使用的是Red Hat,CentOS,Fedora或Amazon Linux:
sudo yum install perl-XML-LibXML
在sudo
的其他平台上(例如OS X),这应该可行,但如果您之前没有运行cpan
,则必须回答很多问题:
sudo cpan XML::LibXML
如果您没有sudo
访问权限,请在没有sudo
的情况下运行相同的命令,并在询问您希望采取的方法时选择local::lib
:
cpan XML::LibXML
答案 1 :(得分:1)
而不是通过名称调用脚本:
perl /path/to/perl/script
我想知道你的第一行是否有隐藏的角色。你在DOS下写了这个文件吗?
使用您的更新,您将不得不安装它找不到的Perl模块。 CPAN上有关于如何安装其他模块的说明。