XML :: Simple中的“格式不正确”错误

时间:2016-07-28 11:57:41

标签: perl xml-parsing

我正在尝试解析一些包含命名空间的XML,但XML::Simple正在抛出错误。

not well-formed (invalid token) at line 3, column 53, byte 63
use Data::Dumper;
use XML::Simple;

my $string = q(
<result>
<something id="207" xlink:href="http://someurl.com&op=yeah">Something 207</something>
</result>
);

print Dumper(XMLin($string));

有没有办法可以让它与XML::Simple一起使用?或者我是否必须使用不同的XML解析库?

1 个答案:

答案 0 :(得分:2)

请注意documentation for XML::Simple中的警告 ,内容如下:

  

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强调XML::LibXMLXML::Twig是一个很好的选择。

XML文档可能不包含CDATA部分之外的&符号&或尖括号< >。在普通(PDATA)数据部分和属性值中,它们需要分别由实体 &amp; &lt;&gt;替换

您的程序正确且数据格式错误。第3行的角色53在这里

<something id="207" xlink:href="http://someurl.com&op=yeah">Something 207</something>
                                                    ^
                                                Column 53

所以报告p(因为&op不是任何已知实体的开头),问题与命名空间无关

我的XML::Simple版本(目前是最新版本2.22)提供了更明确的消息

Entity: line 3: parser error : EntityRef: expecting ';'
<something id="207" xlink:href="http://someurl.com&op=yeah">Something 207</somet
                                                     ^

您可以通过将&符替换为其实体来修复问题,例如

use strict;
use warnings 'all';

use Data::Dump;
use XML::Simple;

my $string = <<END_XML;
<result>
  <something id="207" xlink:href="http://someurl.com&amp;op=yeah">Something 207</something>
</result>
END_XML

dd XMLin($string);

输出

{
  something => {
    "content" => "Something 207",
    "id" => 207,
    "xlink:href" => "http://someurl.com&op=yeah",
  },
}