以下是一些需要处理的xml文件的摘录:
<BirimAdi>Adet</BirimAdi> <BirimCarpan>1</BirimCarpan> <HavaleFiyati>0</HavaleFiyati> <HavaleFiyatiParaBirimi>TL</HavaleFiyatiParaBirimi> <Price1>0</Price1> <SatisFiyati1ParaBirimi>TL</SatisFiyati1ParaBirimi> <Isk1>0</Isk1> <SatisFiyati2>0</SatisFiyati2>
Price1 = round(Price1)-0.1;
该脚本应该对指定路径中的所有xml文件执行此操作.
我考虑使用’sed’或’awk’,但我不确定这可以在sed中轻松完成.使用xmllint对我来说太过分了.有任何想法吗?我是这些实用程序的新手,所以无法想到找到我想要的那个正则表达式是:
/<\s*Price1[^>]*>([^<]*)<\s*\/\s*Price1\s*>/
解决方法
我会使用XML解析器来完成这项工作.例如,XML :: Twig.这是一个例子:
#!/usr/bin/env perl use warnings; use strict; use XML::Twig; for my $f ( @ARGV ) { my $twig = XML::Twig->new( twig_handlers => { 'Price1' => sub { $_->set_text( sprintf( "%.1f",int( $_->text) - 0.1 ) ) },},pretty_print => 'indented',)->parsefile( $f )->print; }
假设文件名是script.pl,测试文件是xmlfile,内容为:
<root> <BirimAdi>Adet</BirimAdi> <BirimCarpan>1</BirimCarpan> <HavaleFiyati>0</HavaleFiyati> <HavaleFiyatiParaBirimi>TL</HavaleFiyatiParaBirimi> <Price1>3.3</Price1> <SatisFiyati1ParaBirimi>TL</SatisFiyati1ParaBirimi> <Isk1>0</Isk1> <SatisFiyati2>0</SatisFiyati2> </root>
运行它像:
perl script.pl xmlfile
产量:
<root> <BirimAdi>Adet</BirimAdi> <BirimCarpan>1</BirimCarpan> <HavaleFiyati>0</HavaleFiyati> <HavaleFiyatiParaBirimi>TL</HavaleFiyatiParaBirimi> <Price1>2.9</Price1> <SatisFiyati1ParaBirimi>TL</SatisFiyati1ParaBirimi> <Isk1>0</Isk1> <SatisFiyati2>0</SatisFiyati2> </root>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。