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::CDATA | CDATA节点 |
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_DECLARATION | XML声明节点 |
XMLReader节点的类型值:
名称 | 类型 | 说明 |
---|---|---|
attributeCount | int | 节点的属性 |
baseURI | string | 节点的Base URI |
depth | int | 节点的树结构深度 |
hasAttributes | bool | 节点是否包含属性 |
havValue | bool | 节点是否包含文本值 |
isDefault | bool | 属性值是否来自默认的DTD |
isEmptyElement | bool | 节点是否是一个空的元素标签 |
localName | string | 节点的本地(local)名 |
name | string | 节点的资格(Qualified)名 |
nameSpaceURI | string | 与节点相关的名称空间的URI |
nodeType | string | 节点的节点类型 |
prefix | string | 与节点相关的名称空间前缀 |