将 SimpleXMLElement 参数保存到全局变量
Saving SimpleXMLElement parameter to global variable
我目前正在使用 Botman 框架让我的机器人读取 XML 文件。
目前,我的机器人能够从 XML 文件中获取数据并输出。
我在将 XML 文件保存回全局变量时遇到问题(以便稍后在代码中重用)。这是我在尝试执行此操作时收到的当前错误消息:
"message": "Serialization of 'SimpleXMLElement' is not allowed",
"exception": "Exception",
"file": "C:\Users\Jack\finalyearproject\gfyp\gfyp\vendor\opis\closure\src\SerializableClosure.php
我在这里遇到问题:
public function nodeTest($xmlFile, $answer)
{
$this->XMLFile = $xmlFile;
...
}
这是函数前的 class 代码:
class StartConversation extends Conversation
{
public $XMLFile;
...
public function askForDatabase()
{
$question = Question::create('Test test test?')
->fallback('Unable to create a new database')
->callbackId('create_database')
->addButtons([
Button::create('Suicide')->value('suic'),
Button::create('Self-harm')->value('sh'),
]);
$this->ask($question, function (Answer $answer) {
$xmlResult = $this->testXMLGrabFunction($answer);
if ($answer->getValue() == 'suic') {
$this->nodeTest($xmlResult, $answer);
}
if ($answer->getValue() == 'sh') {
$this->nodeTest($xmlResult, $answer);
}
});
}
}
这是 class 我最初得到 XML 文件的地方:
class testClass
{
function getXMLCategory($categoryName)
{
$xml = simplexml_load_file('ST-working-age-23-3-20.xml');
if($categoryName == 'suic')
{
$xml = $xml->node[0];
return $xml;
} elseif($categoryName == 'sh') {
$xml = $xml->node[1];
return $xml;
} else {
return null;
}
}
}
任何建议都很好 - 谢谢
错误消息告诉您代码中的某处正在尝试 序列化 对象,即将其转换为字符串表示形式。这可能在您正在使用的框架中,您所认为的“全局变量”实际上以某种形式的会话存储在请求之间,例如在磁盘上的文件中。
由于 SimpleXML 的实现方式,它不允许此操作。最简单的解决方法是通过调用 ->asXML()
来存储 XML,然后在需要时使用 simplexml_load_string()
.
重新解析它
您将希望尽可能少地执行该往返操作,因此值得更好地了解框架实际如何处理“全局变量”,以便您可以尝试在每次请求时执行一次.
我目前正在使用 Botman 框架让我的机器人读取 XML 文件。
目前,我的机器人能够从 XML 文件中获取数据并输出。
我在将 XML 文件保存回全局变量时遇到问题(以便稍后在代码中重用)。这是我在尝试执行此操作时收到的当前错误消息:
"message": "Serialization of 'SimpleXMLElement' is not allowed",
"exception": "Exception",
"file": "C:\Users\Jack\finalyearproject\gfyp\gfyp\vendor\opis\closure\src\SerializableClosure.php
我在这里遇到问题:
public function nodeTest($xmlFile, $answer)
{
$this->XMLFile = $xmlFile;
...
}
这是函数前的 class 代码:
class StartConversation extends Conversation
{
public $XMLFile;
...
public function askForDatabase()
{
$question = Question::create('Test test test?')
->fallback('Unable to create a new database')
->callbackId('create_database')
->addButtons([
Button::create('Suicide')->value('suic'),
Button::create('Self-harm')->value('sh'),
]);
$this->ask($question, function (Answer $answer) {
$xmlResult = $this->testXMLGrabFunction($answer);
if ($answer->getValue() == 'suic') {
$this->nodeTest($xmlResult, $answer);
}
if ($answer->getValue() == 'sh') {
$this->nodeTest($xmlResult, $answer);
}
});
}
}
这是 class 我最初得到 XML 文件的地方:
class testClass
{
function getXMLCategory($categoryName)
{
$xml = simplexml_load_file('ST-working-age-23-3-20.xml');
if($categoryName == 'suic')
{
$xml = $xml->node[0];
return $xml;
} elseif($categoryName == 'sh') {
$xml = $xml->node[1];
return $xml;
} else {
return null;
}
}
}
任何建议都很好 - 谢谢
错误消息告诉您代码中的某处正在尝试 序列化 对象,即将其转换为字符串表示形式。这可能在您正在使用的框架中,您所认为的“全局变量”实际上以某种形式的会话存储在请求之间,例如在磁盘上的文件中。
由于 SimpleXML 的实现方式,它不允许此操作。最简单的解决方法是通过调用 ->asXML()
来存储 XML,然后在需要时使用 simplexml_load_string()
.
您将希望尽可能少地执行该往返操作,因此值得更好地了解框架实际如何处理“全局变量”,以便您可以尝试在每次请求时执行一次.