php - 使用DOMDocument类创建xml消息的最佳实践

原文 标签 php xml class dom

我想为webservice通信创建xml消息。
这些消息应该从可重用元素池中创建。
因此我创建了不同的类。
只返回消息类的“工厂”类。
一个元素类,由可重用部分和消息类组成,它们是所需xml消息的蓝图。
我的代码提供了预期的结果,但我正在寻找最佳实践。
特别是在每个消息类中避免重写相同的save()和*\u construct*方法的方法。
提前谢谢

    // class to create webservice messages
class Messages{

    private function __construct(){}

    public static function get($type) {
        //some error handling if class not exists
        return new $type;
    }
}

// message no.1
class Message_1 extends Elements{

    protected $root;

    public function __construct() {
        parent::__construct();
        $this->root = $this->createElement("message1");
    }

    public function add_anotherElement(){
        $this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
    }

    public function add_element(){
        $this->root->appendChild($this->add_someElementBlock("foo", "bar"));
    }

    public function save(){
        return $this->saveXML($this->root);
    }
}

// message no.2
class Message_2 extends Elements {

    protected $root;

    public function __construct() {
        parent::__construct();
        $this->root = $this->createElement("message2");
    }

    public function add_elements(){
        $this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
        $this->root->appendChild($this->add_someElementBlock("foo", "bar"));
    }

    public function save(){
        return $this->saveXML($this->root);
    }
}

// reusable elements
class Elements extends DOMDocument{

    public function __construct() {
        parent::__construct();
    }

    public function add_someElementBlock($foo, $bar) {
        $node = $this->createElement("root");

        $attr = $this->createAttribute("id");
        $attr->value = $foo;
        $node->appendChild($attr);

        $subnode = $this->createElement("sub",$bar);

        $node->appendChild($subnode);

        return $node;
    }

    public function add_anotherElementBlock($foo, $bar) {
        $node = $this->createElement("anotherRoot");

        $subnode = $this->createElement("anotherSubNode",$bar);
        $attr = $this->createAttribute("anotherAttribute");
        $attr->value = $foo;
        $subnode->appendChild($attr);

        $node->appendChild($subnode);

        return $node;
    }
}

$message1 = Messages::get('Message_1');
$message1->add_element();
$message1->add_anotherElement();


$message2 = Messages::get('Message_2');
$message2->add_elements();

//********************************************
echo "<pre>";
print_r(htmlentities($message1->save()));
echo "</pre>";
echo "<hr />";
echo "<pre>";
print_r(htmlentities($message2->save()));
echo "</pre>";

最佳答案

多亏了他的建议,我改了班。对我来说似乎很好,希望有人也能帮上忙。

// class to create webservice messages
class Messages{

    private function __construct(){}

    public static function get($type) {
        //some error handling if class not exists
        return new $type;
    }
}

// message no.1
class Message_1 extends Elements{

    public function __construct() {
        parent::__construct();
        $this->root = $this->createElement("message1");
    }

    public function add_anotherElement(){
        $this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
    }

    public function add_element(){
        $this->root->appendChild($this->add_someElementBlock("foo", "bar"));
    }
}

// message no.2
class Message_2 extends Elements {

    public function __construct() {
        parent::__construct();
        $this->root = $this->createElement("message2");
    }

    public function add_elements(){
        $this->root->appendChild($this->add_anotherElementBlock("foo", "bar"));
        $this->root->appendChild($this->add_someElementBlock("foo", "bar"));
    }

}

// message no.3
class Message_3 extends Elements {

    public function __construct() {
        parent::__construct();
        $this->root = $this->createElement("message3");
    }

    public function add_element(){
        // unique Element
        $this->root->appendChild($this->createElement("foo", "bar"));
    }

}

// reusable elements
class Elements extends DOMDocument{

    protected $root;

    public function __construct() {
    }

    protected function add_someElementBlock($foo, $bar) {
        $node = $this->createElement("root");

        $attr = $this->createAttribute("id");
        $attr->value = $foo;
        $node->appendChild($attr);

        $subnode = $this->createElement("sub",$bar);

        $node->appendChild($subnode);

        return $node;
    }

    protected function add_anotherElementBlock($foo, $bar) {
        $node = $this->createElement("anotherRoot");

        $subnode = $this->createElement("anotherSubNode",$bar);
        $attr = $this->createAttribute("anotherAttribute");
        $attr->value = $foo;
        $subnode->appendChild($attr);

        $node->appendChild($subnode);

        return $node;
    }

    public function getMessage(){
        return $this->saveXML($this->root);
    }
}

$message1 = Messages::get('Message_1');
$message1->add_element();
$message1->add_anotherElement();

$message2 = Messages::get('Message_2');
$message2->add_elements();

$message3 = Messages::get('Message_3');
$message3->add_element();

//********************************************
echo "<pre>";
print_r(htmlentities($message1->getMessage()));
echo "</pre>";
echo "<hr />";
echo "<pre>";
print_r(htmlentities($message2->getMessage()));
echo "</pre>";
echo "<hr />";
echo "<pre>";
print_r(htmlentities($message3->getMessage()));
echo "</pre>";

关于php - 使用DOMDocument类创建xml消息的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913809/

相关文章:

php - 哪个 MySQL 数据类型用于 IP 地址?

java - 如何在Android中将TableRow宽度设置为最大值?

python - 如何在带有 python 类的 kivy 中使用下拉小部件

java - 为什么我的战舰游戏出现错误java.lang.NullPointerException?

php - php-结果应该在同一页上

php - PHP循环检测MySQL结果的每个字母的第一个实例

java - 如何使用apache camel根据内容大小添加另一个xml标签

delphi - delphi中的单位与其他语言中的类是否相同?

php - 来自SQL的PHP​​动态复选框列表,基于Cascade Select选择

xml - xpath - 获取所选集合的前 10 个项目