哪些库将使用PHP解析DTD

时间:2010-05-27 01:28:52

标签: php parsing dtd

我需要使用PHP解析DTD,并希望有一个简单的库来帮助解决。每个DTD都有许多<!ENTITY...<!-- Comment...元素,我需要对其进行操作。

请注意,我需要针对这些DTD验证任何内容,只需将它们解析为数据文件本身。

我看过几个选项:

James Clarke's SD,这是最后的选择,但我想避免构建/安装/配置PHP外部代码的复杂性。我不确定在我的情况下是否可能。

PEAR有一个XML_DTD_Parser,需要安装/配置PEAR和一些梨模块,我也不确定是否可行,宁可避免。有没有人成功使用它? 编辑:我已经了解到XML_DTD_Parser会丢弃评论,因此不能满足我的需求。

PHP XML Classes有class_path_parser,这是另一个网站建议的,但它无法读取ENTITY元素。它似乎使用PHP的内置XML解析功能,它使用EXPAT。

PHP的DOMDocument will validate against a DTD,所以必须能够阅读它们,虽然我不知道如何直接看到DTD解析器。

2 个答案:

答案 0 :(得分:2)

PHP的标准XML解析器都不能访问通用实体*,很少有人可以访问注释。内置XML Parser的PHP使用Expat,但不公开完整的expat API;特别是,无法设置实体的处理程序。有一个PHP bug提交添加此内容。

AFAICT,在DTD解析器中处理注释和通用实体的唯一方法是编写自己的解析器;手动,或使用可用于php的词法分析器和解析器生成器之一(例如PHP_LexerGeneratorPHP_ParserGenerator等。)

* PHP的expat包装器(XML Parser)确实提供了对符号声明的访问,这些声明声明与通用实体类似,但不一样。

答案 1 :(得分:1)

我不知道这会有用......

如果我理解你在寻找什么,那么你正在寻找一种从DTD中提取和“节点”的方法,以便对它们采取行动。很有意思。这是我大脑的去处:

  • 直接使用DOMDocument class。看起来好像没有明确的方法来获取DTD数据,如果您将DTD视为源。
  • 以相同方式使用SimpleXML。同上。
  • 再次以相同的方式使用XML parser,但使用一些实体声明处理函数来获取信息。我认为这证明了更多的远见,可能不是你需要的。 (虽然我错了。)
  • 使用preg_match_all等来根据模式获取值。与other thoughts in the world不相同。
  • 使用XSLT来除了你需要的东西。删除所有非注释的.xsl非常容易管理。很有可能你只能output them in a format that's easier to parse(比如,在一个更好的XML结构中)。实体可能需要通过PHP的XSL processor进行处理。我对实体有点生疏。

无论如何,我希望其中一些有所帮助。