2013-02-12 33 views
0

如果格式不正確,我有一個任務可以更正xml文件的語法。目前我正在手動執行此任務。有沒有什麼辦法來驗證XML文件的語法,如果XML格式不正確,然後糾正格式不正確?在perl中檢查並更正xml語法

是否可以使用Perl腳本進行驗證和糾正?

感謝,

+1

沒有一種算法可以可靠地取出任意非格式良好的XML並生成反映原始意圖的格式良好的XML。構造可能有許多不同解釋的非格式良好的XML很容易......修正碼如何決定哪一個是正確的?你所要求的等同於編寫一個接受無效代碼並「糾正」它的Java(或Perl)編譯器。如果我們有這些,語法錯誤將成爲過去。 – 2013-02-12 06:32:29

+0

謝謝吉姆。有道理。 我們不能檢查打開和關閉標籤是否正確,如果不正確則更正它們? – MangeshBiradar 2013-02-12 06:36:15

+0

檢查是否...? – 2013-02-12 06:38:28

回答

2

XML::LibXML是一個驗證解析器。您可以使用它來確定XML是否有效。

use XML::LibXML qw(); 
my $parser = XML::LibXML->new(); 
if (eval { $parser->parse_file($qfn) }) { 
    print "ok\n"; 
} else { 
    print "error:\[email protected]"; 
} 

自動修正XML是另一回事。沒有做出巨大的假設就不能自動修復壞的XML。例如,有沒有辦法知道

<foo>/bar<baz/</foo> 

是否意味着是

<foo>/bar&lt;baz/</foo> 

<foo>/bar<baz/></foo> 

甚至別的東西。

XML :: LibXML的確可以自動修復/忽略一些錯誤。誰知道它是否做出了同樣的假設。如果你想解析器是當它修復問題警告使用

use XML::LibXML qw(); 
my $parser = XML::LibXML->new(recover => $recover); 
my $doc = $parser->parse_file($in_qfn); 
$doc->toFile($out_qfn); 

使用1$recover
如果您想讓解析器靜默地修復問題,請使用2替代$recover
不管你用於$recover的是什麼,如果遇到不可恢復的錯誤,仍然會拋出異常。

2

您可以嘗試XML::Liberal:「解析破損的XML的超級自由XML解析器」,並查看它是否適用於您。