繁体   English   中英

PHP5中不同的XML解析库之间有什么区别?

[英]What's the difference between the different XML parsing libraries in PHP5?

最初的问题如下,但我更改了标题,因为我认为找到具有相同疑问的其他人会更容易。 最后,XHTML文档是一个XML文档。

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

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

标签)。

我没有非常使用XML,在PHP(Simple XML,DOM等)中解析似乎有很多选项,我不知道是否所有这些都可以做我需要的,这是最容易的使用。

抱歉我的英语,我是阿根廷人。 谢谢!

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

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

还有DOM XML 这个扩展的“缺点”是它使用起来有点困难,默认情况下它不包括在内。

只是为了清除这里的困惑。 PHP有许多XML库,因为php4在这方面没有很好的选择。 从PHP5开始,您可以选择SimpleXmlDOM基于sax的expat解析器 后者也存在于php4中。 php4也有一个DOM扩展,这与php5的一样。

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

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

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

  • 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文档并查找所有链接,并且您不关心结构。

我更喜欢SimpleXMLElement,因为它很容易用来浏览元素。

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

这是个人选择,但有很多XML扩展

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

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

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

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

这真的取决于你想要完成的事情。 为了提取相当大量的数据,IE很多记录,比如来自商店网站的产品信息,我可能会使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM