Php:在会话中仅加载xml一次

Php:在会话中仅加载xml一次,php,html,ajax,xml,simplexml,Php,Html,Ajax,Xml,Simplexml,我在类中使用Simplexml将xml的适当节点加载到html中 <?xml version="1.0" encoding="UTF-8"?> <note> <item> <title>Reminder</title> </item> <item> <title>Work</title> </item> <item

我在类中使用Simplexml将xml的适当节点加载到html中

<?xml version="1.0" encoding="UTF-8"?>
<note>
 <item>
  <title>Reminder</title>
 </item>
 <item>
  <title>Work</title>
 </item>
 <item>
  <title>Play</title>
 </item>
 <item>
  <title>Cycling</title>
 </item>
</note>

<?php
    class myxmlclass {      
      private $nodeno;
      private $currenttitle;
      private $myno;
    
      //Load xml
      function loadxm() {
        $filename = 'xmlfile.xml';
        if(file_exists($filename)){
            $selxml=simplexml_load_file("xmlfile.xml", 'SimpleXMLElement', LIBXML_NOCDATA ) or die("Error: Cannot load xml");
            htmlspecialchars($selxml);
            return $selxml;
        }
      }
  }

当会话开始时,这很有效,但是当我通过ajax调用访问下一个和上一个项目时,xml会重新加载。我怎样才能防止这种情况发生?如何使xml在会话中仅加载一次?

会话基本上处于状态。在请求之间序列化和非序列化的对象

SimpleXMLElement不能序列化,或者更准确地说,不能像在会话中那样在PHP级别进行序列化

PHP致命错误:未捕获异常:不允许序列化“SimpleXMLElement”

但是你不需要。或者XML没有改变,那么您不需要将其放入会话,只需要指向您感兴趣的元素的指针

这一部分:

$currentnode = $selxml->item[(int) $myno];
                             ^ ^ ^ ^ ^ ^ 
会话只需要知道整数
$myno

或者XML确实发生了变化,那么存储是因为XML字符串可以在会话中完全序列化

$string = $selxml->asXML();
恢复时:

$selxml = simplexml_load_string($string);
这就是你的往返行程


整个会话数据越小越好。从指向当前元素的指针开始。

可能是个愚蠢的问题……但是在会话中存储$selxml并在ajax期间检查该变量怎么样。如果存在,请使用以其他方式运行loadxml()
$selxml = simplexml_load_string($string);