我正在尝试解析一些包含命名空间的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解析库?
答案 0 :(得分:2)
请注意documentation for XML::Simple
中的警告 ,内容如下:
不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强调
XML::LibXML
,XML::Twig
是一个很好的选择。
XML文档可能不包含CDATA部分之外的&符号&
或尖括号<
>
。在普通(PDATA)数据部分和属性值中,它们需要分别由实体 &
<
和>
替换
您的程序正确且数据格式错误。第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&op=yeah">Something 207</something>
</result>
END_XML
dd XMLin($string);
{
something => {
"content" => "Something 207",
"id" => 207,
"xlink:href" => "http://someurl.com&op=yeah",
},
}