我正在尝试解析一个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模块吗?
答案 0 :(得分:5)
XML :: Simple不是适用于一般XML解析的正确解析模块。它的设计考虑了一个目的,即:以XML格式解析配置文件。因此,它可以在某种程度上简化数据,或者很多,这取决于您提供的数据。如果您关心文本和标签的顺序,则不应使用此模块。
答案 1 :(得分:2)
以上是完全有效的XML。你有一个开始元素,后跟一个文本节点,后跟一个开始元素。
我猜(也许)在插入顶级节点之前,你正在解析的文本没有被正确转义。例如也许应该
What's <link:internal>in use</link:internal>
然后,这会导致文本作为一个文本节点并且内容未被解析(如果我正确读取它)。