XML ::简单的输出样式

时间:2015-03-03 09:20:35

标签: xml perl

我需要编辑一个包含以下行的xml文件:

<language name="en_US" title="sprint" subtitle="" url="sprint/en_US/index.html">

我的带有XML :: Simple的perl脚本工作正常,期望我无法以这种格式输出。我明白了:

<language>
  <name>en_US</name>
  <subtitle>My new subtitle</subtitle>
  <title>sprint</title>
  <url>sprint/en_US/index.html</url>
</language>

原则上这很好,但是这里输出文件使用diff与输入文件进行同步。我可以强制XML :: Simple使用与输入样式相同的输出样式吗? 我的代码是:     使用XML :: Simple;

my $xml = XMLin(
  'a.xml',
  KeepRoot => 1,
  ForceArray => 1,
);

# editing xml

XMLout(
  $xml,
  KeepRoot => 1,
  NoAttr => 1,
  OutputFile => 'b.xml',
);

THX

1 个答案:

答案 0 :(得分:2)

首先关闭 - XML::Simple谎言。它不是,它是简单的XML。从它的文档:

  

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。

NoAttr正在对你这样做:

  

NoAttr =&gt; 1#in + out - 得心应手

     

与XMLout()一起使用时,生成的XML将不包含任何属性。所有散列键/值都将表示为嵌套元素。

     

当与XMLin()一起使用时,XML中的任何属性都将被忽略。

可能发现在NoAttr上指定XMLin会做您想做的事情吗?

但我建议改为 - 使用XML::Twig

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $xml =
    '<language name="en_US" title="sprint" subtitle="" url="sprint/en_US/index.html" />';

my $twig = XML::Twig->new->parse($xml);

foreach my $key ( keys %{ $twig->root->atts() } ) {
    print "$key => ", $twig->root->att($key), "\n";
}

$twig->root->del_att('name');

print "With 'name' removed:\n";
$twig->root->print;

如果你能给我一些比较的输入/输出样本,我可以更多地充实这个例子。你可能不想在这里使用root,因为那只是'top'元素 - 但请考虑这个说明。您可以执行foreach ( $twig -> root -> children ) {类型迭代。