XML文件看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<!-- some comment here -->
<rsccat version="1.0" locale="en_US" product="some_prouduct" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../product/resources/schema/msgcat.xsd">
<message>
<entry key="entry1" lol="false">
<![CDATA[
<actions>
<action id="hmm" type="nothing">
<cmd>456</cmd>
<msg id="123"></msg>
</action>
</actions>
]]>
</entry>
<entry key="entry2">message2 </entry>
<entry key="entry3">message3 </entry>
<entry key="entry4">
<actions hello="yes">
<action type="lol">
<cmd>rolf</cmd>
<txt>omg</txt>
</action>
</actions> </entry>
</message>
</rsccat>
字符串
我想用Perl写一个函数,它接受一个XML文件的路径和一个要删除的键的列表,并完全删除与这些键相关的条目,而不留下任何白色或空行。此外,我希望保留原始XML文件中现有的空白行,例如,带有键entry4
的条目之后的三个空白行。
我已经编写了一个函数,它删除条目而不留下任何空行,但它也删除了XML文件中现有的空行。
use File::Slurp;
sub findReplaceFile
{
my ($filename, @keys) = @_;
my $filetext = read_file($filename);
foreach my $key (@keys)
{
chomp($key); # remove newline characters
my $regex = qr/<entry\s+key\s*=\s*"${key}".*?>.+?<\/entry>/s;
$filetext =~ s/$regex//gs; # replacing with empty string
$filetext =~ s/\n\s*\n/\n/g; # removing extra line
}
}
型
请帮助我实现我的目标,我对Perl中的XML解析器模块和普通的正则表达式都很满意。
2条答案
按热度按时间fxnxkyjh1#
编写了一个不使用模块的示例。最有可能的是,在阅读文件时,他们使用了chomp函数,该函数删除了换行符。这不是最终的事实,只是我的假设。就是这个模块(File::Slurp)我从来没有用过。文件app.pl
字符串
此代码不会修改原始XML。它会将结果保存在一个单独的文件中,并在文件名中添加子字符串“.dat”,如下所示:
型
还应该注意的是,这段代码完全将文件读入内存,如果你的文件增长到一个巨大的大小,你将需要重写从文件中逐行阅读的算法,以及动态检查和替换。
下面的代码行与上面的代码完全相同。在终端中运行此行,关键号必须在此部分指定:(?:1| 3)-第一和第三(?:1| 3| 2)-第一、第三和第二等。
型
现在原始文件将以.dat扩展名保存,结果将以原始名称保存到文件中。
mftmpeh82#
回答我自己的问题,为了完成。
感谢@e1st0rm建议使用正则表达式。
字符串