【问题标题】:How can I write XML data to a file with Perl?如何使用 Perl 将 XML 数据写入文件?
【发布时间】:2010-12-27 12:21:31
【问题描述】:

请您更正我下面的代码。

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

【问题讨论】:

  • 我是新手。输入了很多好的建议!我想一一尝试。谢谢大家。
  • 就像我在下面的评论中所说,如果你把 \n 放在单引号中,它将打印出两个字符而不是换行符。
  • 如果您是新手,我还建议您始终执行“使用严格”。将此行放在包含“#!”的行之后。
  • 您确实意识到您正在以附加模式打开data.xml,然后在其上附加应该是该文件第一行的内容,
  • @Sinan:这只是一个简单的测试脚本。是的。我想以附加模式运行我的 perl 脚本。将我的源 TXT 文件转换为目标 XML 文件。

标签: xml perl


【解决方案1】:

问题是字符串中有未转义的引号。使用反斜杠转义引号或用 qq{} 包围您的打印字符串:

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

【讨论】:

    【解决方案2】:
    print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n};
    

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

    【讨论】:

    • @ennukiller:我希望你确实意识到你可以使用qq
    【解决方案3】:

    始终打开警告和限制,以便您更早发现问题所在,并了解更多详细信息:

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

    【讨论】:

      【解决方案4】:

      我建议使用:

      use XML::Simple;
      

      【讨论】:

      【解决方案5】:

      这是我的一些用于打印 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
      

      【讨论】:

      • 为什么投反对票?它说明您可以通过使用此处的文档来避免引用问题。如果您认为我在以某种方式拉皮条我的 免费 软件网站,如果您愿意,我可以删除对它的引用,但我不会通过发布来接触预期的受众(飞行员)它在一个编程网站上。
      • 其他客人投反对票。我只是运行上面的脚本。它现在正在工作。我也同意这是避免引用问题的好方法... :-)
      【解决方案6】:

      总是,总是,总是检查从open返回的值,例如

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

      注意错误信息中的重要部分:

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

      在传递给die 的字符串末尾没有换行符,它会附加您的程序终止的文件和行号。

      【讨论】:

        【解决方案7】:

        如果您想将 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};
        

        【讨论】:

          【解决方案8】:

          另外几点建议:

          【讨论】:

            猜你喜欢
            • 2014-03-12
            • 2013-12-29
            • 1970-01-01
            • 2014-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-07
            相关资源
            最近更新 更多