【问题标题】:Parsing a DTD to reveal hierarchy of elements解析 DTD 以显示元素的层次结构
【发布时间】:2012-06-16 18:07:45
【问题描述】:

我的目标是解析几个相对复杂的 DTD 以揭示元素的层次结构。 DTD 之间的唯一区别是版本,但每个版本都没有尝试保持向后兼容——这太容易了!因此,我打算将每个 DTD 定义的元素结构可视化,以便我可以设计一个适合统一存储数据的数据库模型。

因为我在 Python 中研究过的大多数解决方案都只能针对外部 DTD 进行验证,所以我决定从头开始努力。 Python 的xml.parsers.expat 只解析XML 文件并实现非常基本的DTD 回调,因此我决定查看original version,它是用C 编写的,并声称完全符合XML 1.0 规范。但是,我对这种方法有以下疑问:

  1. 是否将 expat(用 C 语言)解析 DTD 文件中的外部实体引用并遵循这些引用、解析其元素并将这些元素添加到层次结构中?
  2. expat 可以泛化和处理 SGML,还是会在遇到无效的 DTD 但有效的 SGML 文件后失败?

我的要求可能会得出 expat 不合适的结论。如果是这种情况,我正在考虑为 XML 1.0 DTD 编写一个词法分析器/解析器。还有其他我应该考虑的选择吗?

以下更简洁地说明了我的意图:

输入 DTD 摘录

<!--A concise summary of the disclosure.-->
<!ELEMENT abstract (doc-page+ | (abst-problem , abst-solution) | p+)>

从 DTD 摘录创建的对象(伪代码)

class abstract:
    member doc_page_array[]
    member abst_problem
    member abst_solution
    member paragraph_array[]
    member description = "A concise summary of the disclosure."

一个具有挑战性的方面是将出现在其上方的评论归因于&lt;!ELEMENT&gt; 标签。因此,如果我无法使用 expat 来完成此操作,则可能需要使用本地解析器。

另一个问题是,一些解析器在处理使用大于 #xFFFF 的 unicode 字符的 DTD 时遇到问题,因此这可能是另一个有利于我自己创建的因素。

如果事实证明词法分析器/解析器路线更适合我的任务,有没有人碰巧知道将these EBNF expressions 转换为能够被解析的东西的好方法?我想“最好”的方法可能是使用正则表达式。

无论如何,这些只是我对我的问题的想法。对上述问题的任何答案或有关替代方法的建议将不胜感激。

【问题讨论】:

    标签: python xml parsing dtd-parsing


    【解决方案1】:

    有几种现有的工具可以满足您的需求,包括DTDParseOpenSPMatraDTD Parser。还有articles关于创建自定义解析器。

    【讨论】:

    • 看来这些都是Java,而OP要求的是Python。尽管如此,我想了解 Java 也很有用。
    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多