2009-12-17 48 views
1

請問下面請更正我的代碼。如何使用Perl將XML數據寫入文件?

#!/usr/local/bin/perl 

open (MYFILE, '>>data.xml'); 
print MYFILE "<?xml version="1.0" encoding="UTF-8"?>\n"; 
close (MYFILE); 

已更新。

#!/usr/local/bin/perl 
open (MYFILE, '>>data.xml'); 
print MYFILE '<?xml version="1.0" encoding="UTF-8"?\>'."\n"; 
print MYFILE '<?xml version="1.0" encoding="UTF-16"?\>'."\n"; 
close (MYFILE); 

輸出:現在運行良好。

<?xml version="1.0" encoding="UTF-8"?\> 
<?xml version="1.0" encoding="UTF-16"?\> 

但是。

#!/usr/local/bin/perl 
open (MYFILE, '>>data.xml'); 
print MYFILE '<?xml version="1.0" encoding="UTF-8"?\>'.'\n'; 
print MYFILE '<?xml version="1.0" encoding="UTF-16"?\>'.'\n'; 
close (MYFILE); 

輸出:#錯誤格式\ n

<?xml version="1.0" encoding="UTF-8"?\>\n<?xml version="1.0" encoding="UTF-16"?\>\n 
+0

什麼錯誤 – 2009-12-17 03:20:55

+0

我?我想一個一個地嘗試,謝謝大家 – 2009-12-17 03:25:51

+1

就像我在下面的評論中說過的,如果你把\ n放在單引號中,它會打印出兩個字符,而不是一個換行符 – 2009-12-17 03:41:37

回答

5
print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n}; 

你的問題是,你已經嵌套雙引號;使用qq{}來分隔字符串將解決此問題。

+0

如果您使用單引號,\ n將不起作用。 – 2009-12-17 03:20:16

+0

@保羅我站好了。謝謝! – ennuikiller 2009-12-17 03:21:46

+1

@ennuikiller:你知道你可以使用'qq',我希望。 – 2009-12-17 03:49:05

3

我會建議使用:

use XML::Simple; 
+0

@Jay:你可以用'XML :: Simple'發佈一個簡單的例子嗎? – Zaid 2009-12-17 06:52:02

+0

@Zaid:網上有很多教程,下面是一個很好的教程:http://www.ibm.com/developerworks/xml/library/x-xmlperl1.html – 2009-12-17 07:05:06

+0

XML :: Writer是另一個非常簡單的教程 – plusplus 2009-12-17 09:35:06

1

下面是我的一些代碼,打印一個XML文件:

open(XML, ">$xmlfile"); 
print XML (<<EOF); 
<?xml version="1.0" encoding="UTF-8"?> 
<gpx 
version="1.1" 
creator="Navaid Waypoint Generator - http://navaid.com/GPX/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.topografix.com/GPX/1/1" 
xmlns:navaid="http://navaid.com/GPX/NAVAID/1/0" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd 
http://navaid.com/GPX/NAVAID/1/0 http://navaid.com/GPX/NAVAID/1/0"> 
<metadata> 
    <author> 
     <name>Paul Tomblin</name> 
     <email id="ptomblin" domain="xcski.com"/> 
     <link href="http://blog.xcski.com/"/> 
    </author> 
    <link href="http://navaid.com/GPX/"/> 
</metadata> 
EOF 
+0

爲什麼downvote?它說明您可以通過使用here文檔來避免引用問題。如果您認爲我在某種程度上可以推薦我的*免費*軟件網站,那麼我可以根據自己的喜好去除它的參考資料,但這並不像我要通過在編程網站上發佈預期受衆(試用者) 。 – 2009-12-17 03:40:30

+0

也是一個很好的方法。謝謝。 – 2009-12-17 03:41:14

+0

Downvote by other guest。我只是運行上面的腳本。它正在工作。我也同意這是一個避免引用問題的好方法... :-) – 2009-12-17 03:44:13

6

的問題是你必須在字符串中轉義引號。無論是使用反斜槓轉義引號或用QQ {}包圍你的打印字符串:

print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n}; 
--or-- 
print MYFILE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
1

總是,總是,總是檢查open例如返回的值

open (MYFILE, '>>data.xml') 
    or die "$0: open: $!"; 

注意在錯誤信息的重要位:

  1. 失敗的程序的名稱,$0
  2. 什麼要怎樣做,open
  3. 爲什麼會失敗,$!

沒有換行符將字符串的末尾傳遞給die,它將追加程序死亡的文件和行號。

5

始終打開警告和狹窄,所以你發現前面出了什麼差錯,並獲得更多的細節原因:

#!/usr/local/bin/perl 
use strict; 
use warnings; 

始終使用的open詞法-variabled,三個參數的形式(有一個big discussion why over here),並且總是檢查返回值(如果出現錯誤,它將返回一個錯誤,並將原因放在$!變量(see under $! at perldoc perlvar)中。另外,die將打印程序退出的行號,如果不'\n(更多在perldoc -f die)。

open my $file, '>>', 'data.xml' or die "Can't open file: $!"; 

,並使用\n左右雙引號,使其正確打印:建議

print $file '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; 
print $file '<?xml version="1.0" encoding="UTF-16"?>' . "\n"; 
close $file; 
+0

對於未來的幫助建議。 – 2009-12-17 04:00:21

+0

+1瞭解詳情。 – 2009-12-17 04:27:38

0

幾個附加分:

+0

@彼得,感謝您的編輯。 – daotoad 2010-01-19 23:21:28

1

如果你想爲UTF-8的數據寫入一個文件(如你在你的XML聲明中說,打開用UTF-8編碼的文件:

open my($fh), '>:utf8', 'data.xml' or die "Could not open file: $!"; 

print $fh qq{<?xml version="1.0" encoding="UTF-8">\n};