2016-12-12 21 views
0

我有兩個xml文件看起來像這樣

file1.xml如何在`perl`中的'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,感謝幫助。

+2

這篇文章,就像你以前的職位,格式不難懂。用4個空格縮寫您的帖子以顯示代碼;沒有必要使用HTML來格式化您的問題。 – mob

+1

爲什麼你不能使用任何解析模塊? 「增強」意味着「質量,價值或範圍的增加或改善」,這是我認爲難以負面解讀的。 – choroba

+0

我收到了一些有關限制生產env的意見,我辯稱但沒有希望:( – Husk01inJun

回答

3

不要。使用圖書館。認真。 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作爲一個包,所以你甚至不需要CPAN它。或者你也可以「本地」安裝:

"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; 
+0

對於html(xml),我推薦:Mojo :: DOM或HTML :: TreeBuilder – 3ED