我希望XML :: Twig正确地打印在
问题描述:
中解析的内容我有XML,其中包含&; for'等。当我使用XML :: Twig解析它,然后再打印出来时,所有的&'打印为'。另外,XML :: Twig似乎重新排列属性以便按字母顺序排列。从XML的角度来看,这些都是等价的,但是,我想对XML进行一些修改,并使用diff来确认所做的唯一更改是我所期望的。有没有办法让XML :: Twig除了我明确改变之外什么都不能改变?我希望XML :: Twig正确地打印在
这里是我的XML:
<?xml version="1.0" encoding="utf-8"?>
<System>
<P C="C" B="B" A="A">'<>"&</P>
<P A="A" B="B" C="C">'<>"&</P>
</System>
而且perl的:
my $twig = new XML::Twig(KeepSpaces => 'true');
$twig->parsefile("test.xml");
$twig->print();
而且这里是获取打印:
<?xml version="1.0" encoding="utf-8"?>
<System>
<P A="A" B="B" C="C">'<>"&</P>
<P A="A" B="B" C="C">'<>"&</P>
</System>
答
这似乎是keep_encoding
选项的伎俩:
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new(
keep_spaces => 1,
keep_encoding => 1,
keep_atts_order => 1,
);
$twig->parsefile('test.xml');
$twig->print;
更新:改进以响应mirod的评论。
怎么样在比较之前“统一”原始和输出?我们使用'xmllint --c14n FILE.XML | xmllint --format -',然后是标准的'diff'。 – choroba
这是一个想法。我仍然希望不必对XML进行标准化来进行差异化,但这可能是一个合理的回退。 – JamieC