8

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

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

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

标签)。

我用的XML不多,PHP中解析的选项似乎很多(Simple XML、DOM等),不知道是否都可以做我需要的,这是最简单的一个使用。

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

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

4

7 回答 7

6

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

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

于 2008-10-29T13:53:47.223 回答
4

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

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

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

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

于 2008-10-29T16:14:28.280 回答
4
  • DOM是一种标准的、独立于语言的 API,用于分层数据,例如由 W3C 标准化的 XML。它是一个功能丰富的 API。它是基于对象的,因为每个节点都是一个对象。

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

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

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

于 2009-04-09T03:56:36.697 回答
1

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

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

不过,这确实是个人选择,有很多XML 扩展

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

于 2008-10-29T13:55:17.767 回答
0

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

于 2008-10-29T13:56:49.917 回答
0

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

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

于 2008-10-29T14:07:58.553 回答
0

这实际上取决于您要完成的工作。为了提取相当大量的数据,例如,从商店网站获取产品信息的许多记录,我可能会使用 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

于 2008-10-29T14:17:28.673 回答