解析DTD以显示元素的层次结构

时间:2012-06-13 18:04:00

标签: python xml parsing dtd-parsing

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

因为我在Python中调查的大多数解决方案只会验证外部DTD,所以我决定从一开始就开始努力。 Python的xml.parsers.expat只解析XML文件并实现非常基本的DTD回调,所以我决定查看用{C}编写的original version并声称完全符合XML 1.0规范。但是,我对此方法有以下问题:

  1. expat(在C中)将解析DTD文件中的外部实体引用并遵循这些引用,解析它们的元素,并将这些元素添加到层次结构中吗?
  2. expat可以泛化并处理SGML,还是会在遇到无效的DTD但有效的SGML文件后失败?
  3. 我的要求可能导致外籍人士不合适的结论。如果是这种情况,我考虑为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."
    

    一个具有挑战性的方面是将<!ELEMENT>标记归于其上方出现的评论。因此,如果我不能使用expat来实现这一点,那么可能需要一个自己开发的解析器。

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

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

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

1 个答案:

答案 0 :(得分:0)

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