当前位置: 首页 > 面试题库 >

PHP的DOM和SimpleXML扩展之间有什么区别?

司寇羽
2023-03-14
问题内容

我无法理解为什么我们在PHP中需要2个XML解析器。

有人可以解释两者之间的区别吗?


问题答案:

简而言之:

SimpleXml

  • 用于简单的XML和/或简单的UseCases
  • 与节点一起使用的有限API(例如,不能对接口进行太多编程)
  • 所有节点属于同一种类(元素节点与属性节点相同)
  • 节点可以魔术访问,例如 $root->foo->bar['attribute']

DOM

  • 适用于您可能拥有的任何XML UseCase
  • 是W3C DOM API的实现(发现有多种语言实现)
  • 区分各种节点类型(更多控制权)
  • 由于使用显式API,因此更加冗长(可以对接口进行编码)
  • 可以解析损坏的HTML
  • 允许您在XPath查询中使用PHP函数

这两个都是基于libxml的,并且可以受libxml函数的某些扩展影响

就个人而言
,我不太喜欢SimpleXml。那是因为我不喜欢隐式访问节点,例如$foo->bar[1]->baz['attribute']。它将实际的XML结构与编程接口联系在一起。一切都是单节点类型也有些不直观,因为SimpleXmlElement的行为根据其内容而神奇地改变。

例如,当您拥有<foo bar="1"/>的对象转储/foo/@bar将与的对象转储相同时,对/foo它们进行回显将显示不同的结果。而且,由于它们都是SimpleXml元素,因此可以在它们上调用相同的方法,但是只有在SimpleXmlElement支持它的情况下才会应用它们,例如,尝试$el->addAttribute('foo', 'bar')在第一个SimpleXmlElement上执行任何操作。现在,您当然可以将属性添加到“属性节点”,这是正确的,但重点是,属性节点首先不会公开该方法。

但这只是我的2分。 下定决心 :)

旁注中
,没有两个解析器,但是在PHP中有两个解析器。SimpleXml和DOM只是将文档解析为树形结构的两个。其他的是基于拉或事件的解析器/读取器/写入器。



 类似资料:
  • 那么,和到底有什么区别呢?什么时候我们应该偏爱一个而不是另一个?

  • 问题内容: PHP中的 Session 和 Cookies 之间有什么区别? 问题答案: Cookie是浏览器存储的一点数据,并随每个请求发送到服务器。 会话是存储在服务器上并与给定用户相关联的数据的集合(通常通过包含ID码的Cookie)

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 用Java导入和扩展类有什么区别 问题答案: 那是两件事。 导入一个类是为了使您可以使用该类,而无需在要编写的当前类中限定全名。 扩展类是创建一个新类,该新类是某个其他类的子类。这将允许您添加或更改要扩展的类的功能。

  • 我目前正在阅读有关通配符的文章,但我不知道它们之间是否有任何区别?扩展了Animal,E扩展了Animal。

  • DOM扩展 尽管现在DOM已经很完善了。但为了实现更多、更复杂的功能,仍然会有一些标准或专有扩展被纳入W3C标准中。现在DOM主要有两个扩展:selector API(选择符API)和HTML5。 选择符API 在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过tag, name