如何控制 XMPP XML
Posted
技术标签:
【中文标题】如何控制 XMPP XML【英文标题】:How to control XMPP XML 【发布时间】:2019-01-04 11:57:49 【问题描述】:我正在制作XMPP php client,目前在测试阶段我制作了这样的节(即存在):
const PRESENCE = <<<PRESENCE
<presence from="from" to="to" type="type" />
PRESENCE;
const PRIORITY = <<<PRIORITY
<presence from="from">
<priority>priority</priority>
</presence>
PRIORITY;
但是,在开发库时,我想以编程方式进行,因为我觉得这种方法看起来像是硬编码的,即使我确实像这样解析它:
$preparedString = str_replace(
['from', 'priority'],
[$from, $priority],
Xml::PRIORITY
);
所以我最终创建了一个 Presence
类,它应该包含所有与存在相关的方法并充当一种 XML 构建器,它看起来像这样:
private $instance = null;
public function __construct()
$this->instance = new \DOMDocument();
$this->instance->formatOutput = true;
public function requestPresence(string $from, string $to, string $type = "subscribe")
$presenceNode = $this->instance->createElement('presence');
$presenceNode->setAttribute("from", $from);
$presenceNode->setAttribute("to", $to);
$presenceNode->setAttribute("type", $type);
return $this->instance->saveXML($presenceNode);
public function setPriority(int $priority, string $from = null)
$presenceNode = $this->instance->createElement('presence');
if ($from)
$presenceNode->setAttribute("from", $from);
$priorityNode = $this->instance->createElement('priority');
$priorityNode->appendChild($this->instance->createTextNode($priority));
$presenceNode->appendChild($priorityNode);
return $this->instance->saveXML($presenceNode);
但现在我有一些疑问,因为我的代码已经增加了三倍,而且它实际上之前更具可读性。我想保持简单有效且没有代码重复,但我觉得我在这里遗漏了一些东西。有没有更巧妙的方法来做到这一点?
【问题讨论】:
【参考方案1】:DOMDocument 是一个更详细的 XML 接口,您可以使用 SimpleXML 来减少样板代码。
class XML
public static function requestPresence(string $from, string $to, string $type = "subscribe")
$instance = new SimpleXMLElement("<presence />");
$instance["from"] = $from;
$instance["to"] = $to;
$instance["type"] = $type;
return $instance->asXML();
public static function setPriority(int $priority, string $from = null)
$instance = new SimpleXMLElement("<presence />");
if ($from)
$instance["from"] = $from;
$instance->priority = $priority;
return $instance->asXML();
这假设它们是两个独立的需求,它们只是实用功能,而不是必须维护任何状态。
如果您需要构建具有更多选项的文档,那么以下内容可能更有用...
class XML2
private $instance = null;
public function __construct()
$this->instance = new SimpleXMLElement("<presence />");
public function requestPresence(string $from, string $to, string $type = "subscribe")
$this->instance["from"] = $from;
$this->instance["to"] = $to;
$this->instance["type"] = $type;
return $this;
public function setPriority(int $priority, string $from = null)
if ($from)
$this->instance["from"] = $from;
$this->instance->priority = $priority;
return $this;
public function getXML()
return $this->instance->asXML();
调用使用...
echo (new XML2())->requestPresence("from", "to", "type")
->setPriority(1)
->getXML();
创造...
<?xml version="1.0"?>
<presence from="from" to="to" type="type"><priority>1</priority></presence>
使用 DOMDocument 或 SimpleXML 解决方案会感觉比您的原始版本更臃肿 - 但会提供更强大的解决方案,比依赖字符串处理更易于维护。
【讨论】:
我在考虑第二种方法,但是如果我有优先级,那么我不需要from
、to
和type
。其他节也一样,我不能以这种方式使用构造函数,因为我得到了服务器不接受的 XML。其他看起来不错以上是关于如何控制 XMPP XML的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Tsung 编写用于负载测试“XMPP over BOSH”的 xml 脚本?