【问题标题】:What's the difference between the different XML parsing libraries in PHP5?PHP5中不同的XML解析库有什么区别?
【发布时间】:2010-09-19 19:06:25
【问题描述】:

原来的问题在下面,但我改变了标题,因为我认为找到有同样疑问的其他人会更容易。归根结底,XHTML 文档就是 XML 文档。

这是一个初学者的问题,但我想知道您认为在 PHP5 中解析 XHTML 文档的最佳库是哪个?

我已经使用 Tidy 从 HTML 文件(使用 Word :S 创建)生成了 XHTML,并且知道我需要替换其中的一些元素(比如 and 元素,替换

中的一些属性

标签)。

我没怎么用过XML,PHP中解析的选项似乎很多(Simple XML, DOM, etc.),不知道是不是都可以做我需要的,一个是最容易使用的一种。

对不起我的英语,我来自阿根廷。谢谢!

我提供更多信息:我有很多 HTML 页面,都是在 Word 97 中完成的。我使用 Tidy 在 XHTML Strict 中清理和转换它们,所以现在它们都与 XML 兼容。我想使用 XML 解析器来查找一些元素并替换它们(我这样做的逻辑并不重要)。例如,我希望所有页面都使用相同的 CSS 样式表和类属性,以实现统一的外观。它们都是包含法律文件的静态页面,没有什么奇怪的。我应该使用哪个扩展? SimpleXML 足够了吗?尽管更难,我应该学习 DOM 吗?

【问题讨论】:

    标签: php xml parsing xhtml


    【解决方案1】:
    • DOM 是一种标准的、独立于语言的 API,用于分层数据,例如由 W3C 标准化的 XML。它是一个功能丰富的 API。它是基于对象的,因为每个节点都是一个对象。

      当您不仅想要读取或写入,而且想要对现有文档的节点进行大量操作(例如在其他节点之间插入节点、更改结构等)时,DOM 是很好的选择。

    • SimpleXML 是一个特定于 PHP 的 API,它也是基于对象的,但旨在比 DOM 更简洁:简单的任务,例如查找节点的值或查找它的子元素需要更少的代码。它的 API 没有 DOM 丰富,但它仍然包含 XPath 查找等功能,以及处理多命名空间文档的基本能力。而且,重要的是,它仍然保留了文档的所有特性,例如 XML CDATA 部分和 cmets,即使它不包含操作它们的函数。

      SimpleXML 非常适合只读:如果您只想读取 XML 文档并将其转换为另一种形式,那么它将为您节省大量代码。当您想要生成文档或进行基本操作(例如添加或更改子元素或属性)时,它也相当不错,但是对现有文档进行大量操作可能会变得复杂(但并非不可能)。例如,在其他两个元素之间添加一个子元素并不容易; addChild 仅在其他元素之后插入。 SimpleXML 也不能进行 XSLT 转换。它没有像'getElementsByTagName'或getElementById'这样的东西,但如果你知道XPath,你仍然可以用SimpleXML做那种事情。

      SimpleXMLElement 对象有点“神奇”。如果您 var_dump/printr/var_export 与其完整的内部表示不对应,则它公开的属性。它公开了它的一些子元素,就好像它们是可以使用 -> 运算符访问的属性一样,但仍然在内部保留完整的文档,并且您可以执行诸如访问名称是带有 [] 保留字的子元素之类的事情运算符,就好像它是一个关联数组一样。

    您不必完全承诺其中之一,因为 PHP 实现了这些功能:

    • simplexml_import_dom(DOMNode)
    • dom_import_simplexml(SimpleXMLElement)

    如果您使用 SimpleXML 并且需要处理需要 DOM 节点的代码,这将很有帮助,反之亦然。

    PHP 还提供了第三个 XML 库:

    • XML ParserSAX 的实现,一种独立于语言的接口,但在手册中没有提到该名称)是一个低级得多的库,它用于完全不同的目的。它不会为您构建对象。它基本上只是让您更容易编写自己的 XML 解析器,因为它为您完成了前进到下一个标记的工作,并找出标记的类型,例如标记名称是什么以及它是开始标记还是结束标记.然后,您必须编写每次遇到令牌时都应运行的回调。所有任务,例如将文档表示为树中的对象/数组、操作文档等都需要单独实现,因为您可以使用 XML 解析器编写一个低级解析器。

      如果您有特定的内存或速度要求,XML 解析器功能仍然非常有用。有了它,就可以编写一个解析器来解析一个很长的 XML 文档,而无需一次将其所有内容保存在内存中。此外,如果您对所有数据不感兴趣,并且不需要或不希望将其放入树或 PHP 对象集,那么它可以更快。例如,如果您想扫描一个 XHTML 文档并找到所有链接,而您并不关心结构。

    【讨论】:

    • 很好的总结,并且重点突出了那里的导入功能。似乎很多人忘记了您可以根据需要进行切换。
    • 为了完整起见,我添加了一些关于 SAX 解析器的信息。
    【解决方案2】:

    只是为了澄清这里的混乱。 PHP 有许多 XML 库,因为 php4 在这方面没有很好的选择。从 PHP5 开始,您可以在 SimpleXmlDOMsax-based expat parser 之间进行选择。后者也存在于php4中。 php4 也有一个 DOM 扩展,它和 php5 的一样。

    DOM 和 SimpleXml 是同一问题域的替代方案;他们将文档加载到内存中,并让您以树结构的形式访问它。 DOM 是一个相当庞大的 api,但它也非常一致,并且以多种语言实现,这意味着您可以跨语言重用您的知识(例如在 Javascript 中)。 SimpleXml 一开始可能更容易。

    SAX 解析器是另一种野兽。它将 xml 文档视为标签流。如果您正在处理非常大的文档,这很有用,因为您不需要将它们全部保存在内存中。

    对于您的使用,我可能会使用 DOM api。

    【讨论】:

    • 我决定使用 DOM,因为它是用另一种语言实现的。我认为这将是我更好的时间投资。
    • 我认为这是一个明智的选择。
    【解决方案3】:

    这实际上取决于您要完成的工作。 对于从商店网站提取大量数据,即很多记录,例如产品信息,我可能会使用 Expat,因为它应该更快一些...... 就个人而言,我已经拥有足够大的 XML 来显着提升性能。 在这些数量上,您还不如使用 SQL。

    我推荐使用 SimpleXML。 它非常直观,易于使用/编写。 此外,与 XPath 配合得很好。

    从来没有真正使用过 DOM,但如果您将 XML Parser 用于您所描述的大的东西,您可能想要使用它,因为它比 SimpleXML 更实用。

    您可以在 W3C 学校阅读所有这三个方面的信息:

    http://www.w3schools.com/php/php_xml_parser_expat.asp

    http://www.w3schools.com/php/php_xml_simplexml.asp

    http://www.w3schools.com/php/php_xml_dom.asp

    【讨论】:

      【解决方案4】:

      去年我在 PHP5 中做了一点 XML 解析,决定使用 SimpleXML 的组合。

      如果您想创建一个新的 XML 树或添加到现有的 XML 树,DOM 会更有用一点,它稍微灵活一些。

      【讨论】:

        【解决方案5】:

        我更喜欢SimpleXMLElement,因为它很容易用于遍历元素。

        编辑:它说没有可用的版本信息,但它在 PHP5 中可用,至少 5.2.5 但可能更早。

        不过,这确实是个人选择,XML extensions 很多。

        请记住,如果您有无效的标记,许多 XML 解析器会犹豫 - XHTML 应该是 XML,但并非总是如此!

        【讨论】:

          【解决方案6】:

          自从我在 PHP 中使用 XML 解析以来已经有很长一段时间(2 年或更长时间),但我总是从 XML_Parser Pear package 获得良好、可用的结果。话虽如此,我对 PHP5 的了解很少,所以我真的不知道这些天是否有更好的内置替代方案。

          【讨论】:

            【解决方案7】:

            您可以使用SimpleXML,它包含在默认的 PHP 安装中。这个扩展提供了对 XML 结构的简单的面向对象的访问。

            还有DOM XML。此扩展的一个“缺点”是使用起来有点困难,并且默认情况下不包含它。

            【讨论】:

            • DOMXML 是一个 php4 模块。 php5 自带 DOM 库。
            猜你喜欢
            • 2012-02-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-23
            • 2011-03-30
            • 1970-01-01
            相关资源
            最近更新 更多