PHP解析大型XML文档

PHP中有两种主要的XML解析器

1)基于树的解析器。它是把整个文档存储为树的数据结构中,即需要把整个文档都加载到内存中才能工作。所以,当处理大型XML文档时候,性能剧减。SimpleXML和DOM扩展属于此类型解析器。

2)基于流的解析器。它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互(当移向下一个节点时,上一个节点是被丢弃,但也设置为保留)。很明显,其效率要高且占内存少,不便之处代码量大点。

所以,PHP中处理大型XML文档可以用XMLReader扩展方案(基于流的解析器)。它在PHP 5.1中默认是启用的。

举例:

// 创建对象
$reader = new XMLReader();

// 从一个文档或URL中加载XML数据
$reader->open('filename.xml');
// 或从变量加载
$reader->XML($document);

// 遍历
while($reader->read()) {
  // statement
}

XMLReader节点类型值:

节点类型说明
XMLReader::NONE非节点类型
XMLReader::ELEMENT开始元素
XMLReader::ATTRIBUTE属性节点
XMLReader::TEXT文本节点
XMLReader::CDATACDATA节点
XMLReader::ENTITY_REF实体引用节点
XMLReader::ENTITY实体声明节点
XMLReader::PI处理指令节点
XMLReader::COMMENT注释节点
XMLReader::DOC文档节点
XMLReader::DOC_TYPE文档类型节点
XMLReader::DOC_FRAGMENT文档片段节点
XMLReader::NOTATION符号节点
XMLReader::WHITESPACE空白节点
XMLReader::SIGNFICANT_WHITESPACE显著空白节点
XMLReader::END_ELEMENT结束元素
XMLReader::END_ENTITY结束实体
XMLReader::XML_DECLARATIONXML声明节点

XMLReader节点的类型值:

名称类型说明
attributeCountint节点的属性
baseURIstring节点的Base URI
depthint节点的树结构深度
hasAttributesbool节点是否包含属性
havValuebool节点是否包含文本值
isDefaultbool属性值是否来自默认的DTD
isEmptyElementbool节点是否是一个空的元素标签
localNamestring节点的本地(local)名
namestring节点的资格(Qualified)名
nameSpaceURIstring与节点相关的名称空间的URI
nodeTypestring节点的节点类型
prefixstring与节点相关的名称空间前缀

发表回复

您的电子邮箱地址不会被公开。