已启用SimpleXML却报Call to undefined method错误的问题排查
问题解答
核心原因
SimpleXMLElement类本身没有实现Iterator接口,所以它根本不存在rewind()这类迭代器方法。而你提到的SimpleXmlIterator是专门实现了Iterator接口的类,自然具备rewind()、current()、next()这些迭代器必备方法。
为什么会有混淆?
你能通过foreach遍历SimpleXMLElement的子节点,是因为PHP内部对它做了隐式的迭代支持,但这不代表它本身是迭代器,不能直接调用迭代器的方法。而saveXML()是SimpleXMLElement的原生方法,和迭代器能力完全没关系,所以能正常运行。
解决办法
如果需要使用rewind()这类迭代器方法,有两种选择:
- 直接用SimpleXmlIterator创建实例:
$xmlIterator = new SimpleXmlIterator('<books><book>PHP Basics</book><book>XML Basics</book></books>'); $xmlIterator->rewind(); // 此时可正常执行 - 将已有的SimpleXMLElement转换为SimpleXmlIterator:
$xmlElement = new SimpleXMLElement('<books><book>PHP Basics</book><book>XML Basics</book></books>'); $xmlIterator = new SimpleXmlIterator($xmlElement->asXML()); $xmlIterator->rewind();
内容的提问来源于stack exchange,提问作者Laurent Mortier
相关产品推荐
相关产品推荐

