2013-10-10 92 views
0

我想在perl中製作一個簡單的腳本,它將在xml文件中查找明顯的錯誤。我認爲完成這個任務的最好方法是創建一個正則表達式並讓perl使用它來返回xml的壞行。這裏是我的代碼使用正則表達式來使用Perl搜索XML文件

#!/usr/bin/perl 
$file = '/path/to/my/xml/file.txt'; 
open(txt, $file); 
while($line = <txt>) { 
    print "$line" if $line =~ m/<[a-zA-Z]*>[$a-zA-Z0-9]*>[a-zA-Z0-9]*</; 
} 
close(txt); 

我使用的作品完美地在記事本++的正則表達式,但是當我把它在Perl它不想工作。我試圖找到一行看起來像這樣的xml

<tag>badline></tag> 

如果我分開我的正則表達式行返回。

m/<[a-zA-Z]*> -works 
[$a-zA-Z0-9]*> -works 
[a-zA-Z0-9]*</; -works 

但是當我將它們組合起來就像我在代碼中顯示,它不

任何幫助是極大的讚賞,感謝。

+1

這是處理XML的一種非常糟糕的方式。爲什麼不使用CPAN的許多XML解析器來檢查錯誤? – friedo

+1

歡迎來到SO。這個問題似乎每天都會出現一次,所以在發佈之前進行搜索將是合適的。簡單的答案是,正則表達式正是用於處理XML的錯誤工具。看到[這個答案](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454)使用一個真正的XML解析器,你可以找到CPAN 。 –

+0

你意識到' badline>'實際上是格式良好的XML嗎? – mirod

回答

1

必須始終use strictuse warnings頂部每隔 Perl程序,無論多麼微不足道,並利用自己的第一點聲明使用my所有變量。這會提醒你Perl正試圖在正則表達式中插入變量$a,該正則表達式是未定義的,因此計算結果爲空字符串。

我不知道爲什麼要在字符類中匹配美元字符,但是您需要在Perl正則表達式中將其轉義,如[\$a-zA-Z0-9]。儘管如此,除非你有一個speficic格式問題,否則我認爲只通過XML解析器或編輯器來放置XML會更好。這樣就可以立即指出任何錯誤,而不必檢查具體問題。

+0

聖牛做到了。非常感謝。 我會使用更傳統的解析器,但它的工作和他們想在特定的環境中使用腳本,以便任何人都可以運行腳本來驗證開發人員給我們的東西。所以我想寫一個簡單的Perl腳本是正則表達式內置的方法。如果你有一個關於我應該如何去做這件事的建議,我就會全神貫注。再次感謝。 – whit3y

+0

如果你的XML有一個DTD或描述它的模式,那麼你需要使用它。 – Borodin

-1

我認爲最好使用大寫字母作爲文件句柄,並記住在使用後關閉文件句柄。

#!/usr/bin/perl -w //try to always use warning; 
use strict; //try to open strict. 
open(TXT,"/path/to/my/xml/file.txt") or die "Cannot open the file $!"; 
while(<TXT>) 
{ 
    if(/<.*>(.*)?<.*>/) // I am not sure whether you have other formats but this one works well with the format your provided. 
    { 
      print $_; 
    } 
} 
close TXT;