【问题标题】:Why does XML::Simple flatten this Tomboy note?为什么 XML::Simple 会扁平化这个 Tomboy 笔记?
【发布时间】:2009-12-17 21:04:59
【问题描述】:

我正在尝试解析一个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 解析这个,它把&lt;link:internal /&gt; 节点拉出到perl 中的一个单独的对象中。

编辑:生成的对象(&lt;text /&gt; 节点看起来像这样。请注意,“链接:内部”是与“内容”分开的实体。

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

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

如果它是一个错误,有没有人知道另一个可以解决这个问题的 XML 模块?

【问题讨论】:

    标签: xml perl


    【解决方案1】:

    XML::Simple 不是用于一般 XML 解析的正确解析模块。它的设计初衷是为了一个目的,那就是:解析 XML 格式的配置文件。所以它在一定程度上简化了数据——或者很多,这取决于你提供什么。如果你关心文本和标签的顺序,你不应该使用这个模块。

    【讨论】:

    • 这是正确的答案。您希望您的解析树是有序的,就像它在标记中一样,但是 XML::Simple 将其扁平化为具有“链接:内部”之类的“字段”的对象。查看 XML::Parser::Style::Tree 以获得您可能想要的表示形式。
    【解决方案2】:

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

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

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

    这将导致将文本作为一个文本节点获取并且内容不被解析(如果我没看错的话)。

    【讨论】:

    • 不幸的是,这不是我的选择。我只是从 Tomboy 的文件结构中得到什么。
    • 我认为您必须获取顶级节点的内容并重新解析为文本,然后(根据需要重新生成和转义)。
    猜你喜欢
    • 2018-10-26
    • 2014-10-12
    • 2017-10-13
    • 2016-11-09
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多