为什么XML :: Simple会压扁这个Tomboy笔记?

时间:2009-12-17 21:04:59

标签: xml perl

我正在尝试解析一个Tomboy音符,其中包含指向其中另一个音符的链接。 XML看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<note version="0.3" xmlns:link="http://beatniksoftware.com/tomboy/link" xmlns:size="http://beatniksoftware.com/tomboy/size" xmlns="http://beatniksoftware.com/tomboy">
  <title>Our IP Blocks</title>
  <text xml:space="preserve"><note-content version="0.1">Our IP Blocks

What's <link:internal>in use</link:internal>?</note-content></text>
  <last-change-date>2009-03-10T10:24:36.3730770-04:00</last-change-date>
  <last-metadata-change-date>2009-03-10T10:24:36.3730770-04:00</last-metadata-change-date>
  <create-date>2009-03-10T10:23:14.2936280-04:00</create-date>
  <cursor-position>92</cursor-position>
  <width>450</width>
  <height>289</height>
  <x>0</x>
  <y>27</y>
  <open-on-startup>False</open-on-startup>
</note>

我正在用XML::Simple解析它,它正在将<link:internal />节点拉出到perl中的单独对象中。

编辑:生成的对象(<text />节点如下所示。请注意,'link:internal'是与'content'不同的实体。

'text' => {
  'xml:space' => 'preserve',
  'note-content' => {
    'version' => '0.1',
    'link:internal' => 'in use',
    'content' => [
        'Our IP Blocks
        What\'s ',
        '?'
    ]
  }
}

这是一个错误,还是我疯了?所有的验证器都表明这是有效的XML,但我以前从未见过这样的标签嵌套在这样的文本中。

如果是一个错误,有没有人知道另一个能够做到这一点的XML模块吗?

2 个答案:

答案 0 :(得分:5)

XML :: Simple不是适用于一般XML解析的正确解析模块。它的设计考虑了一个目的,即:以XML格式解析配置文件。因此,它可以在某种程度上简化数据,或者很多,这取决于您提供的数据。如果您关心文本和标签的顺序,则不应使用此模块。

答案 1 :(得分:2)

以上是完全有效的XML。你有一个开始元素,后跟一个文本节点,后跟一个开始元素。

我猜(也许)在插入顶级节点之前,你正在解析的文本没有被正确转义。例如也许应该

What's &lt;link:internal&gt;in use&lt;/link:internal&gt;

然后,这会导致文本作为一个文本节点并且内容未被解析(如果我正确读取它)。