[英]How can I write XML data to a file with Perl?
您能否在下面更正我的代码。
#!/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
问题是字符串中的引号没有转义。 可以使用反斜杠对引号进行转义,也可以将打印字符串用qq {}括起来:
print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n};
--or--
print MYFILE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n};
您的问题是您嵌套了双引号。 使用qq{}
分隔字符串将解决此问题。
始终打开警告和限制,以便您更早发现问题所在,并详细了解原因:
#!/usr/local/bin/perl
use strict;
use warnings;
始终使用open
的词法变量三参数形式(这里有一个很大的讨论,为什么要这样 ),并始终检查返回值(如果出现问题,它将返回错误,并将原因放在$!
变量中) ( 请参见$!
在perldoc perlvar下 )。另外,如果不使用\\n
结束字符串, die
将打印程序退出的行号(更多信息请参见 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;
我建议使用:
use XML::Simple;
这是我的一些用于打印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
总是,总是, 总是检查open
返回值, 例如 ,
open (MYFILE, '>>data.xml')
or die "$0: open: $!";
请注意错误消息中的重要位:
$0
open
$!
在传递给die
的字符串的末尾没有换行符的情况下,它将在程序终止处追加文件和行号。
如果要将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};
其他几点建议:
要编写复杂的结构化文件,请使用XML :: Simple之类的库,或者使用CPAN上众多其他库之一。
如果要编写许多非常相似的文件,则模板模块可能更合适。
重新接受以太的建议: open
, strict
和warnings
。 这将节省您调试的时间。
如果要声明文件具有特定的编码( UTF-8或UTF-16 ),则可能应该向文件发出实际的Unicode文本 。 在perldoc -f open中有更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.