DOM和simplexml处理xml非常的灵活方便,它们的内存组织结构与xml文件格式很相近。但是同时它们也有一个缺点,对于大文件处理起来力不从心,太耗内存了。

还好有xmlreader,基于流的解析器,(什么是基于流)。它可以对于xml大文件进行解析,采用一边读取一边解析的方法,而不是一股脑儿都加载到内存去处理。但是它也有缺点,不够灵活方便(这是DOM和simplexml擅长的)。

那些把他们结合起来,不就可以很好的解析大文件了吗? 我写了一个简单的类实现了一点点鸡肋般的功能。

xml文件

<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
<title>PHP: Behind the Parser</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El ActÓr</actor>
</character>
</characters>
<plot>
So, this language. It's like, a programming language. Or is it a
scripting language? All is revealed in this thrilling horror spoof
of a documentary.
</plot>
<great-lines>
<line>PHP solves all my web problems</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
<movie>
<title>PHP: Behind the Parser</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El ActÓr</actor>
</character>
</characters>
<plot>
So, this language. It's like, a programming language. Or is it a
scripting language? All is revealed in this thrilling horror spoof
of a documentary.
</plot>
<great-lines>
<line>PHP solves all my web problems</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>

实现类

class SimpleXmlReader extends XMLReader{

    public function __construct($source, $isfile = false){
if($isfile){
$this->open($source);
}else{
$this->XML($source);
}
} public function getElement($nodename, $depth = 0){
if($this->localName == $nodename && $this->nodeType == self::ELEMENT){
if(!$depth || ($depth && $depth == $this->depth)){
$this->next();
}
}
while($this->read()){
if($this->localName == $nodename && $this->nodeType == self::ELEMENT){
if(!$depth || ($depth && $depth == $this->depth)){
return true;
}
}
}
return false;
} public function expandNodeToSimpleXml(){
if($this->nodeType == self::ELEMENT){
$node = $this->expand();
$dom = new DomDocument();
$n = $dom->importNode($node, true);
$sxe = simplexml_import_dom($n);
return $sxe;
}
return false;
}
}

实例代码:

$xmlhl = new SimpleXmlReader('test.xml', true);
while($xmlhl->getElement('movie')){
$sxe = $xmlhl->expandNodeToSimpleXml();
foreach($sxe->characters[0] as $character){
echo "\n name -> " . $character->name;
echo "\n actor -> " . $character->actor;
}
}

结构:

 name -> Ms. Coder
actor -> Onlivia Actora
name -> Mr. Coder
actor -> El ActÓr
name -> Ms. Coder
actor -> Onlivia Actora
name -> Mr. Coder
actor -> El ActÓr

最新文章

  1. 设计 api, url 的原则
  2. Python基础篇【第8篇】: Socket编程(二)SocketServer
  3. 从H264码流中获取视频宽高 (SPS帧) 升级篇
  4. 正常月报表年初未分配利润修改backup
  5. JSP取得绝对路径
  6. A Xamarin.Forms Infinite Scrolling ListView
  7. github生成燃尽图
  8. Android中style的使用
  9. 替代Eval的两种方式
  10. NOI2002银河英雄传说
  11. 把图片生成Base64字符串
  12. Linux修改SSH连接数 重启SSH服务
  13. 3、XCode: 如何添加自定义代码片段
  14. Django SNS 微博项目开发
  15. Python全栈开发记录_第四篇(集合、函数等知识点)
  16. Eclipse Tomcat部署web项目时出现There are no resources that can be added or removed from the server解决办法
  17. [国家集训队]middle 解题报告
  18. analyse web.xml of hello1
  19. 加密入门(三):TrueCrypt(转)
  20. 基于bootstrap的后台左侧导航菜单和点击二级菜单刷新二级页面时候菜单展开显示当前菜单

热门文章

  1. 使用ImageMagick处理图片后导致图片变大的问题
  2. jQuery委托
  3. java课程设计全程实录——第3天
  4. HTML5的音频播放和视频播放
  5. 依赖注入(IOC) 详解
  6. 关于使用myeclipse搭建tomcat环境运行web项目的方法
  7. 460在全志r16平台tinav3.0系统下使用i2c-tools
  8. Bmob使用心得
  9. Java锁,真的有这么复杂吗?
  10. windows sdk编程禁止窗体最大化最小化