将非结构化文档解析为XML

pet*_*ust 5 xml parsing

我正在使用模板将非结构化文档解析为结构化表示(XML)以描述预期结果.一个简单的典型问题可能是字符串列表:

"Chapter 1"
"Section background"
"this is something"
"this is another"
"Section methods"
"take some xxx"
"do yyy"
"and some..."
"Chapter apparatus"
"we created..."
Run Code Online (Sandbox Code Playgroud)

我希望转变为:

<div role="CHAPTER" title="1">
  <div role="SECTION" title="background">
    <p>this is a paragraph...</p>
    <p>this is another...</p>
  </div>
  <div role="SECTION" title="methods">
    <p>take some xxx</p>
    <p>do yyy</p>
    <p>and some...</p>
  </div>
</div>
<div role="CHAPTER" title="apparatus">
  <div role="SECTION" title="???">
    <p>we created...</p>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

标签CHAPTER和SECTION不存在于字符串中,而是从启发式正则表达式(例如" [Cc]hap(ter)?(\s\d+\.)?.*")生成,并应用于所有字符串.

预期的结果由"模板"描述,目前看起来像:

<template count="0," role="CHAPTER">
  <regex>[Cc]hap(ter)?(\s+.*)</regex>
  <template count="0," role="SECTION">
   <regex>[Ss]ec(tion)?(\s+.*)</regex>
    <template count="0," role="p">
     <regex>.*</regex>
    </template>
  </template>
</template>
Run Code Online (Sandbox Code Playgroud)

(在某些情况下,计数可以是范围,例如2,4).

我知道这是一个非常困难的问题(SGML试图解决它的一部分)并且真正的文档不能完全符合这些模板,因此我准备部分解析并失去一些精确度和召回.

多年来,我一直使用自己的工作代码,适用于各种类型的文档,最高可达几兆字节.性能不是问题.我有不同的模板用于不同的文档类型(论文,日志文件,fortran输出等).一些文档具有嵌套结构(例如,如上所述),而其他文档更平坦但具有更多类型的标记.

我现在正在重构这个并且想知道:

  • 是否有一个开源工具包来解决这个问题?(最好是Java)
  • 如果没有,我可以使用XSLT2分组策略结合正则表达式
  • 或者我应该使用自动机吗?如果是这样,我应该使用工具包还是自己编写?

编辑:@naspinski和一般.始终可以编写特定的脚本代码来解决特定问题.我想要一个通用的解决方案,因为我可能正在解析许多(甚至数百万)文档,其结构具有可靠的(但不是无限的)可变性.我希望解析文档的结构用XML表示,而不是脚本.我相信通过模板(声明性)而不是脚本添加新的解决方案会更容易.

编辑我几乎可以肯定我现在最好的方法是使用ANTLR.它是一个强大的工具,从我最初的探索可以解析行和行组.

pet*_*ust 0

我相当确定我正在寻找的答案就在 ANTLR ( http://www.antlr.org/ ) 中。这允许我编写以下形式的表达式:

document : (chapter)+;
chapter : 'Chapter ' DIGIT NEWLINE line+;
Run Code Online (Sandbox Code Playgroud)

等等。它还允许将代码嵌入到这些表达式中。