Perl XML::Simple 不一致的行为
Perl XML::Simple Inconsistent behavior
我正在使用 XML::Simple
读取 XML 文件
但是,我面临着 "odd" 的情况,其中 XML::Simple 在主机之间表现不一致
我最能猜到 shell 可以发挥一些作用 - 但我不能确定,因为我没有发现针对 XML::Simple
的任何此类问题记录
任何指针都将对调试此问题有很大帮助
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
sub readXml() {
print "XML::Simple version : $XML::Simple::VERSION\n";
my ($phRec) = eval {XMLin("sample.xml", ForceArray => 1, KeyAttr => [] )};
if ( $@ ) {
print (join '', $@);
return 0;
}
print Dumper($phRec);
return 1;
}
readXml();
sample.xml
<?xml version="1.0" encoding="utf-8"?>
<node>
<people name="whatever">etc</people>
<people name="abc <whatever> pqr">etc</people>
</node>
我知道这不是有效的 XML - 但我宁愿 XML::Simple 在两个主机中都失败。
Host1 [开发主机]
bin: perl -v
这是为 x86_64-linux 构建的 perl 5,版本 14,subversion 1 (v5.14.1)
...
bin: echo $SHELL
/bin/bash
bin: ./template
XML::Simple version : 2.18
$VAR1 = {
'people' => [
{
'content' => 'etc',
'name' => 'whatever'
},
{
'content' => 'etc',
'name' => 'abc <whatever> pqr'
}
]
};
主机 2 [虚拟机]
bash-4.1# perl -v
这是为 x86_64-linux-thread-multi...
构建的 perl,v5.10.1 (*)
bash-4.1#回显$SHELL
/bin/csh
bash-4.1# ./template
XML::Simple version : 2.18
sample.xml:4: parser error : Unescaped '<' not allowed in attributes values
<people name="abc <whatever> pqr">etc</people>
^
sample.xml:4: parser error : attributes construct error
<people name="abc <whatever> pqr">etc</people>
...
XML::Simple 在 Host1 上使用的 XML 解析器显然比 Host2 更宽松。
XML::Simple 实际上并不解析 XML。它将该任务委托给 XML::Parser or XML::SAX。即使那样,后者本身也会将解析委托给许多其他模块之一。
并非所有这些解析器都具有相同的质量。
请参阅 XML::Simple's documentation for more info. That section documents a means to select the parser XML::Simple uses. However, you should this chance to stop using XML::Simple! It's so 的 "Environment" 部分,它自己的文档不鼓励人们使用它!
我正在使用 XML::Simple
读取 XML 文件但是,我面临着 "odd" 的情况,其中 XML::Simple 在主机之间表现不一致
我最能猜到 shell 可以发挥一些作用 - 但我不能确定,因为我没有发现针对 XML::Simple
的任何此类问题记录任何指针都将对调试此问题有很大帮助
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
sub readXml() {
print "XML::Simple version : $XML::Simple::VERSION\n";
my ($phRec) = eval {XMLin("sample.xml", ForceArray => 1, KeyAttr => [] )};
if ( $@ ) {
print (join '', $@);
return 0;
}
print Dumper($phRec);
return 1;
}
readXml();
sample.xml
<?xml version="1.0" encoding="utf-8"?>
<node>
<people name="whatever">etc</people>
<people name="abc <whatever> pqr">etc</people>
</node>
我知道这不是有效的 XML - 但我宁愿 XML::Simple 在两个主机中都失败。
Host1 [开发主机]
bin: perl -v
这是为 x86_64-linux 构建的 perl 5,版本 14,subversion 1 (v5.14.1) ...
bin: echo $SHELL
/bin/bash
bin: ./template
XML::Simple version : 2.18
$VAR1 = {
'people' => [
{
'content' => 'etc',
'name' => 'whatever'
},
{
'content' => 'etc',
'name' => 'abc <whatever> pqr'
}
]
};
主机 2 [虚拟机]
bash-4.1# perl -v
这是为 x86_64-linux-thread-multi...
构建的 perl,v5.10.1 (*)bash-4.1#回显$SHELL
/bin/csh
bash-4.1# ./template
XML::Simple version : 2.18
sample.xml:4: parser error : Unescaped '<' not allowed in attributes values
<people name="abc <whatever> pqr">etc</people>
^
sample.xml:4: parser error : attributes construct error
<people name="abc <whatever> pqr">etc</people>
...
XML::Simple 在 Host1 上使用的 XML 解析器显然比 Host2 更宽松。
XML::Simple 实际上并不解析 XML。它将该任务委托给 XML::Parser or XML::SAX。即使那样,后者本身也会将解析委托给许多其他模块之一。
并非所有这些解析器都具有相同的质量。
请参阅 XML::Simple's documentation for more info. That section documents a means to select the parser XML::Simple uses. However, you should this chance to stop using XML::Simple! It's so