【问题标题】:I want XML::Twig to print exactly what was parsed in我希望 XML::Twig 准确打印解析的内容
【发布时间】:2013-07-09 12:54:58
【问题描述】:

我的 XML 包含 ' for ' 等。当我使用 XML::Twig 解析它然后再次打印出来时,所有的 '打印为 '.此外,XML::Twig 似乎重新排序属性以按字母顺序排列它们。从 XML 的角度来看,这些是等效的,但是,我想对 XML 进行一小部分更改并使用 diff 来确认所做的唯一更改是我想要的。有没有办法让 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>

【问题讨论】:

  • 在比较之前“统一”原始和输出怎么样?我们对两者都使用xmllint --c14n FILE.XML | xmllint --format -,然后使用标准diff
  • 这是一个想法。我仍然希望不必规范化 XML 来做差异,但这可能是一个合理的后备。

标签: xml perl xml-twig


【解决方案1】:

似乎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 的评论进行了改进。

【讨论】:

  • 还有keep_atts_order =&gt; 1
  • 如果您知道要更改哪些元素,可以使用twig_roots =&gt; { elt =&gt; sub { change_elt( $_); $_-&gt;flush } }, twig_print_outside_roots =&gt; 1
猜你喜欢
  • 2016-08-15
  • 2016-04-07
  • 2014-05-11
  • 2013-04-18
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多