【问题标题】:How can I write at the top of an XML file with XML::Writer如何使用 XML::Writer 在 XML 文件的顶部写入
【发布时间】:2017-02-27 11:18:48
【问题描述】:

我在 Perl 中使用XML::Writer 创建了一个 XML 文件,我希望每次调用我的脚本时,它都会在旧文件的开头写入新的 XML 文件。我知道如何在文件的开头写一行,但是使用 XML::Writer 我找不到如何做到这一点。

my $output = new IO::File(">>tmp.xml");
my $writer = new XML::Writer( 
OUTPUT      => $output,
DATA_INDENT => 3,             # indentation, trois espaces
DATA_MODE   => 1,             # changement ligne.
);

这是我编写 xml 文件的脚本的开头。

编辑
我实际上做了一个看起来像这样的changelog.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="changelog.xsl" type="text/xsl"?>

<root text="MultiDiag">
<version number="V: 7.07.10.0" date="Release date (Fri Oct  7 14:44:52 2016)">
Things
</version>
</root>

我想要的是每天,新的更新日志都写在旧日志的顶部:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="changelog.xsl" type="text/xsl"?>
<root text="MultiDiag">
<version number="V: 7.07.10.0" date="Release date (The new one)">
Things
</version>
<version number="V: 7.07.10.0" date="Release date (The old one)">
Things
</version>
</root>  

【问题讨论】:

  • 欢迎使用 Stack Overflow 和 Perl 标签。您能否举例说明您希望输出是什么样的?你可以edit你的问题。通常在一个文件中有一种 XML 数据结构。总有一个元素围绕着一切。不清楚你写到顶部是什么意思。
  • 根据定义,这几乎是无效的 XML,因为您没有正确的根标签。
  • 请不要使用间接宾语表示法。在某些时候,您会因它导致的错误而绊倒,并且会浪费数小时试图找到它。您应该使用IO::File-&gt;new(...)XML::Writer-&gt;new(...),而不是new IO::File(..)new XML::Writer(...)
  • 感谢 Dave 的提示,我会这样做的。

标签: xml perl


【解决方案1】:

诀窍是不要让 XML::Writer 直接写入文件。相反,您可以将OUTPUT 设置为"self",然后使用$writer-&gt;to_string method 获取带有渲染输出的字符串。

之后,您需要做的就是关注this example from perlfaq5,了解如何写入文件开头。您基本上逐行读取现有文件,然后将其打印回新文件。如果您在第 1 行($. 是正在读取的当前行号),则从$writer 打印 XML。然后,您将临时新文件移动/重命名为旧文件。

use strict;
use warnings;
use IO::File;
use XML::Writer;

my $writer = XML::Writer->new( 
    OUTPUT      => 'self',
    DATA_INDENT => 3,             # indentation, trois espaces
    DATA_MODE   => 1,             # changement ligne.
);

# ... put in your data

# open the old file and a temporary new file
open my $in,  '<',  'tmp.xml'  or die "Can't read old file: $!";
open my $out, '>', 'tmp.xml.new' or die "Can't write new file: $!";

# read from the old file
while( <$in> ) {
    # write the XML into the first line
    print $out $writer->to_string if $. == 1;

    # write the rest of the file line by line
    print $out $_;
}
close $in; 
close $out;

# replace the old file with the new file
rename 'tmp.xml.new', 'tmp.xml';

【讨论】:

  • 谢谢 simbabque 它完美地工作。 “输出 => self”是我需要的。
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2011-09-06
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多