【问题标题】:"Not well-formed" error from XML::Simple来自 XML::Simple 的“格式不正确”错误
【发布时间】:2016-07-28 11:57:40
【问题描述】:

我正在尝试解析一些包含命名空间的 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 解析库?

【问题讨论】:

  • 这不是有效的 XML - 有一个 &amp; 不表示实体的开始 - 因此是错误。
  • @ikegami 哪一部分无效?
  • 请注意,如果您想处理命名空间,XML::Simple 是一个非常糟糕的选择

标签: perl xml-parsing


【解决方案1】:

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

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

XML 文档在 CDATA 部分之外不得包含与符号 &amp;amp; 或尖括号 &amp;lt; &amp;gt;。在普通 (PDATA) 数据段和属性值中,它们需要分别替换为 entities &amp;amp; &amp;lt;&amp;gt;

您的程序是正确的,但您的数据格式不正确。第 3 行的字符 53 在这里

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

所以它报告了p(因为&amp;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",
  },
}

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多