Разбор DTD для выявления иерархии элементов
Моя цель - проанализировать несколько относительно сложных DTD, чтобы выявить иерархию элементов. Единственное различие между DTD - это версия, но каждая версия не делала попыток оставаться обратно совместимыми - это было бы слишком просто! Таким образом, я намереваюсь визуализировать структуру элементов, определенных каждым DTD, чтобы я мог спроектировать модель базы данных, подходящую для равномерного хранения данных.
Поскольку большинство решений, которые я исследовал в Python, будут проверяться только на наличие внешних DTD, я решил начать свои усилия с самого начала. Питона xml.parsers.expat
анализирует только XML-файлы и реализует очень простые обратные вызовы DTD, поэтому я решил проверить оригинальную версию, написанную на C, и заявляет, что полностью совместим со спецификациями XML 1.0. Однако у меня есть следующие вопросы об этом подходе:
- Будет ли expat (в C) анализировать ссылки на внешние объекты в файле DTD и следовать этим ссылкам, анализировать их элементы и добавлять эти элементы в иерархию?
- Может ли expat обобщать и обрабатывать SGML, или он потерпит неудачу после обнаружения недопустимого DTD, но все же действительного файла SGML?
Мои требования могут привести к выводу, что экспат не подходит. Если это так, я подумываю написать лексер / парсер для DTD XML 1.0. Есть ли другие варианты, которые я должен рассмотреть?
Следующее более кратко иллюстрирует мое намерение:
Отрывок ввода 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 для этого.
Другая проблема заключается в том, что некоторые анализаторы имеют проблемы с обработкой DTD, которые используют символы Юникода больше, чем #xFFFF, так что это может быть еще одним фактором, способствующим созданию моего собственного.
Если окажется, что маршрут лексера / парсера лучше подходит для моей задачи, знает ли кто-нибудь о хорошем способе преобразования этих выражений EBNF во что-то, что может быть проанализировано? Я полагаю, что "лучшим" подходом может быть использование регулярных выражений.
Во всяком случае, это только те мысли, которые у меня были по поводу моей проблемы. Будем благодарны за любые ответы на вышеуказанные вопросы или предложения по альтернативным подходам.
1 ответ
Существует несколько существующих инструментов, которые могут соответствовать вашим потребностям, включая DTDParse, OpenSP, Matra и DTD Parser. Также есть статьи по созданию пользовательского парсера.