繁体   English   中英

如何使用Perl将XML数据写入文件?

[英]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: $!";

请注意错误消息中的重要位:

  1. 失败的程序的名称, $0
  2. 它试图做什么, open
  3. 为什么失败, $!

在传递给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};

其他几点建议:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM