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

Sta*_*ann 53 php simplexml domdocument

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

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

Gor*_*don 98

简而言之:

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执行任何操作都不会.当然,您无法向属性节点添加属性是正确的,但重点是,属性节点首先不会公开该方法.

但那只是我的2c.自己决定 :)


旁注中,没有两个解析器,但在PHP中还有一些.SimpleXml和DOM只是将文档解析为树结构的两个.其他的是基于拉或基于事件的解析器/读者/编写者.

另见我的回答


Jos*_*vis 39

我将尽可能做出最短的答案,以便初学者可以轻松地将它拿走.我也为了简短而略微简化了一些事情.跳过那个夸大的TL; DR版本的答案的结尾.


DOM和SimpleXML 实际上不是两个不同的解析器.真正的解析器是libxml2,它由DOM和SimpleXML内部使用.所以DOM/SimpleXML只是两种使用相同解析器的方法,它们提供了将一个对象转换为另一个对象的方法.

SimpleXML旨在非常简单,因此它具有一小组功能,并且专注于读取和写入数据.也就是说,您可以轻松读取或写入XML文件,您可以更新某些值或删除一些节点(有一些限制!),就是这样.没有花哨的操作,并且您无法访问不太常见的节点类型.例如,SimpleXML无法创建CDATA部分,尽管它可以读取它们.

DOM提供了一个完整的DOM实现以及一些非标准方法,如appendXML.如果您习惯在Javascript中操作DOM,那么您将在PHP的DOM中找到完全相同的方法.你可以做什么基本上没有限制,它平均处理HTML.这种丰富功能的另一面是它比SimpleXML 更复杂,更冗长.


边注

人们常常想/他们应该使用什么扩展来处理他们的XML或HTML内容.实际上选择很简单,因为开始时没有多少选择:

  • 如果你需要处理HTML,你真的没有选择:你必须使用DOM
  • 如果你必须做任何花哨的事情,比如移动节点或附加一些原始XML,那么你几乎不得不使用DOM
  • 如果您只需要读取和/或编写一些基本的XML(例如,使用XML服务交换数据或阅读RSS源),那么您可以使用其中任何一种. 两者都有.
  • 如果你的XML文档太大而不适合内存,你就不能使用它们而你必须使用同样基于libxml2的XMLReader,使用起来更烦人但仍然可以和其他人一起使用

TL; DR

  • SimpleXML非常易于使用,但仅适用于90%的用例.
  • DOM更复杂,但可以做任何事情.
  • XMLReader非常复杂,但使用的内存非常少.非常情绪化.

  • 谢谢约什.对于那些像WTF这样的妓女来说,事情是:"太久了;没看过". (10认同)
  • 请删除**复杂的**或将其标记为个人意见.DOM不**复杂.它干净而明确的API使其易于掌握,即使对于初学者也是如此.与SimpleXml不同,由于我在答案中指出的原因,你必须猜测它的作用.仅仅因为某些事情是冗长的并不意味着它更复杂.反之.除此之外,还有好的写作. (2认同)