我如何只用Java解析一个DTD文件,一次一行,没有任何验证

时间:2012-05-28 03:16:07

标签: java parsing merge dtd

我收到了一个无效的DTD文件,该文件包含重复元素且元素不相同:

<!ELEMENT Data (Name, address?)>
<!ELEMENT Data (Name, age)>

我需要编写一个实用程序来读取DTD并合并如下所示的元素:

<!ELEMENT Data (Name, address?, age)>

我似乎无法找到一个允许我一次只解析一个元素的java库(比如SAX)。

我真正想要的是将<!ELEMENT Data (Name, address?)>读入数据结构,如数组映射或类似的东西。

任何指针都会非常感激。

1 个答案:

答案 0 :(得分:1)

在我看来,您必须立即阅读所有DTD ELEMENT,否则您无法将它们配对,如您在示例中所示。

因为DTD描述可以有任意嵌套(...)正则表达式在理论上无法帮助你。实际上,大多数DTD ELEMENTS只有一层或两层(...),因此它们可能有效。如果您的问题在很大程度上看起来像您已经展示过,那么您可以通过字符串黑客攻击并手动修复其余部分。 (阅读单行不会删除它; ELEMENT描述可以跨越多行并以“...&gt;”结束,你必须找到它。)

如果您想要一个可靠的自动化方法,那么您需要的是什么 一个program transformation system。 DTD是一种特殊类型的正式系统;您需要一个可以读取正式描述实例的工具,允许您访问读取和更新代表实例的数据结构(通常调用抽象语法树),并将结果重写为有效的源文本。

不是Java,但我们的DMS Software Reengineering Toolkit是一个程序转换引擎。它有一个能够解析DTD的XML前端, 事实上,我们使用这些DTD构建代码生成器。