【问题标题】:Php: Load xml only once in a sessionPHP:在会话中仅加载一次 xml
【发布时间】:2021-07-29 09:09:59
【问题描述】:

我在一个类中使用 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;
        }
      }
  }

页面加载时,根据设置为变量$myno的动态数字选择项目:

  $currentnode = $selxml->item[(int) $myno];
  $currenttitle = $currentnode->title;

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

【问题讨论】:

  • 也许是个愚蠢的问题……但是如何在会话中存储 $selxml 并在 ajax 期间检查该 var。如果存在则使用否则运行 loadxml ()

标签: php html ajax xml simplexml


【解决方案1】:

会话基本上是状态。在请求之间进行序列化和反序列化的一种。

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

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

但你不需要。要么 XML 没有改变,那么你不需要把它放到 session 中,只需要指向你感兴趣的元素的指针。

可能是这部分:

$currentnode = $selxml->item[(int) $myno];
                             ^ ^ ^ ^ ^ ^ 

会话只需要知道整数$myno

或者 XML 确实发生了变化,然后存储为 XML - 字符串可以在会话中完美地序列化。

$string = $selxml->asXML();

以及恢复时:

$selxml = simplexml_load_string($string);

你有你的往返。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2014-07-21
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    相关资源
    最近更新 更多