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

时间:2009-12-17 03:14:12

标签: xml 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"?\>

BUT。

#!/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

8 个答案:

答案 0 :(得分: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 :(得分:5)

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

你的问题是你有嵌套的双引号;使用qq{}来分隔字符串将解决此问题。

答案 2 :(得分:5)

始终启用警告和限制,以便您早些时候发现问题所在,并获取更多详细信息:

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

始终使用open的词法变量,三参数形式(有一个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;

答案 3 :(得分:3)

我建议使用:

use XML::Simple;

答案 4 :(得分: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

答案 5 :(得分:1)

始终,始终始终检查open返回的值,例如

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

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

  1. 失败的程序名称$0
  2. 它正在尝试做什么,open
  3. 失败的原因,$!
  4. 在传递给die的字符串末尾没有换行符时,它会附加程序死亡的文件和行号。

答案 6 :(得分: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};

答案 7 :(得分:0)

其他几点建议: