我有两个xml文件看起来像这样
的 file1.xml
< uf>232< /uf>
< boid>32892< /boid>
< end> End of xml 1 < /end>
的 file2.xml
< id> 232 < /id>
< boid>< /boid>
< end> End of xml 2 < /end>
我必须在perl中编写一个函数,它会复制< boid>
file1.xml
标记之间的数字,并在< boid>
file2.xml
标记之间写入。
问题是我不允许包含任何解析模块作为其增强功能,
我尝试过这样的事情:
open(my $vt_open1 ,'<' "file1.xml");<br>
open(my $vt_open2 ,'+>' "file2.xml");<br>
select $vt_open2 or die $!;
while($vt_open1){
if ($. == 2) {
print $vt_open1;
}
}
这不起作用,正在写整个文件
我在查找逻辑时遇到了麻烦,使用行号不是一个好的逻辑,
我是perl的新手,感谢你的帮助。
答案 0 :(得分:3)
唐&#39;吨。使用图书馆。认真。 It's an utterly terrible idea to hack together your own parser just because you don't want to install one. XML是上下文的。正则表达式不是。使用正则表达式来解析XML并不是一个肮脏的黑客,而且你不需要,因为xpath
存在。
大多数标准发行版都包含XML::Twig
作为套餐,因此您甚至不必为其付费。或者您可以在本地&#39;
"How do I keep my own module library/directory"
通过这样做,总是创建脆弱的代码。
然而,仅仅因为我一直在那里并且被卡住了:
#!/usr/bin/env perl
use strict;
use warnings;
my $xml1 = '
<xml>
<uf>232</uf>
<boid>32892</boid>
<end> End of xml 1 </end>
</xml>';
my ( $boid_value ) = $xml1=~ m,<boid>([^<]+)</boid>,ms;
print $boid_value;
my $xml2 = '
<xml>
<uf>232</uf>
<boid></boid>
<end> End of xml 2 </end>
</xml>';
$xml2 =~ s,<boid>[^<]*</boid>,<boid>$boid_value</boid>,ms;
print "Modified XML is:\n";
print $xml2;
我会告诫这一点 - 这将永远是一个冒险的选择,并且有一天可能完全破坏,因为您可以通过语义相同的一系列不同方式重新格式化XML。或者有人可能会在某一天向<boid>
添加一个属性,或类似的东西,而你的东西就会破裂。
为了便于比较 - 使用XML::Twig
,这看起来像:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $xml1 = '
<xml>
<uf>232</uf>
<boid>32892</boid>
<end> End of xml 1 </end>
</xml>';
my $xml2 = '
<xml>
<uf>232</uf>
<boid></boid>
<end> End of xml 2 </end>
</xml>';
my $twig = XML::Twig -> new -> parse ( $xml1 );
my $second_xml = XML::Twig -> new -> parse ( $xml2 );
my $boid_value = $twig -> get_xpath('//boid',0)->text;
$_ -> set_text($boid_value) for $second_xml->get_xpath('//boid');
$second_xml -> set_pretty_print('indented');
$second_xml -> print;