我希望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">&apos;&lt;&gt;&quot;&amp;</P> 
    <P A="A" B="B" C="C">'&lt;>"&amp;</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">'&lt;>"&amp;</P> 
    <P A="A" B="B" C="C">'&lt;>"&amp;</P> 
</System> 
+3

怎么样在比较之前“统一”原始和输出?我们使用'xmllint --c14n FILE.XML | xmllint --format -',然后是标准的'diff'。 – choroba

+0

这是一个想法。我仍然希望不必对XML进行标准化来进行差异化,但这可能是一个合理的回退。 – JamieC

这似乎是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的评论。

+1

也'keep_atts_order => 1' – mirod

+1

,如果你知道你想改变哪些元素,你可以使用'twig_roots => {elt => sub {change_elt($ _); $ _-> flush}},twig_print_outside_roots => 1' – mirod