我有一个xml文件包含数据:
<get>9090</get><br>
<setId>setIdHere</set>
<mainId>121</mainId>
由于我没有使用任何外部lib /软件包,但是我需要使用I / O进行一些更改。
我需要使用setIdHere
更改字符串something
。请在下面找到perl代码:
my $filename="file1.xml";
my $idVal=3232;
open(my $fh , '>>' ,$fileName);
select $fh or die $!;
s/setIdHere/$idVal;
print;
select STDOUT;
close($fh);
上面的代码将值附加到最后,但我想用字符串setIdHere
替换它。
我是新手,不知道上述代码有什么问题。
提前致谢。
答案 0 :(得分:2)
首先,您的代码使用了一些异常过时的技术。 protected DataTable Group(DataTable _dt)
{
DataTable dTable = new DataTable();
dTable.Columns.Add("Region_Name", typeof(string));
dTable.Columns.Add("PercentComplete", typeof(Double));
var query = from row in _dt.AsEnumerable()
group row by row.Field<string>("Region_Name") into grp
select new
{
Region_Name = grp.Key,
PercentComplete = grp.Average(r => r.Field<Double>("PercentComplete"))
};
foreach (var grp in query)
{
dTable.Rows.Add(grp.Region_Name, grp.PercentComplete);
}
return dTable;
}
具有全局影响,最好避免使用。
一般情况下,要编辑文件,您需要将其打开以进行阅读,将其读入,更改并再次将其写回。为了避免将整个文件拉入内存,文件可能非常大,您通常会逐行执行此操作。
你不能写入你正在阅读的同一个文件(嗯,你可以,但它会弄得一团糟),所以你写一个临时文件然后当你完成重命名为原来的
select $fh
HOWEVER 您正在编辑XML。 XML是结构化的,您不应该尝试使用正则表达式来读取和编辑它。您需要使用XML::LibXML或XML::Twig等XML库来解析它。
你说你不能使用任何外部库,但我敢打赌你可以,这只是弄清楚如何。如果你这样做,你会有更轻松的时间。通常原因是您没有管理员权限。最简单的解决方案是安装perlbrew并安装您自己可以管理的Perl副本。 Perlbrew让这很容易。
答案 1 :(得分:1)
请never ever use regular expressions to parse XM L。 XML是上下文的,而正则表达式则不是。因此,只有曾经成为一个肮脏的黑客。
如果您需要修改XML文件,我建议XML::Twig
。它支持xpath
,它与类似正则表达式,但本质上处理上下文问题。
XML::Twig
也可以使用'parsefile_inplace'来编辑你的文件:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
sub modify_setId {
my ( $twig, $setId ) = @_;
$setId -> set_text('3232');
$twig -> flush;
}
my $twig = XML::Twig -> new ( twig_handlers => { 'setId' => \&modify_setId } );
$twig -> set_pretty_print('indented');
$twig -> parsefile_inplace('test.xml');