一尘不染

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

php

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

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


阅读 257

收藏
2020-05-29

共1个答案

一尘不染

简而言之:

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只是将文档解析为树形结构的两个。其他的是基于拉或事件的解析器/读取器/写入器。

2020-05-29