【问题标题】:PHP Call to undefined method DOMElementPHP调用未定义的方法DOMElement
【发布时间】:2016-03-02 07:14:18
【问题描述】:

我有用于创建 xml 文件的包装类,但我不知道如何重写 add() 方法才能正常工作。变量 SHOPITEM 应该是父元素,但我不知道如何在 add 方法中访问它。

欢迎任何建议

  class Items {

    const XML_VERSION enter code here= '1.0';
    const XML_ENCODING = 'utf-8';
    const SHOP = 'SHOP';

    private $xml, $xmlElement;

    public function __construct() {
        $this->xml = new DOMDocument(self::XML_VERSION, self::XML_ENCODING);
        //$this->xml->preserveWhiteSpace = false;
        $this->xml->formatOutput = true;
        $this->xmlElement = $this->create(self::SHOP);
    }

    public function create($nodeName, $value = null) {
        return $this->xml->createElement($nodeName, $value);
    }

    public function add($object) {
        return $this->xmlElement->appendChild($object);
    }

    public function write() {
        $this->xml->appendChild($this->xmlElement);
        $this->xml->save("test.xml");
    }

}

$items = new Items();
$SHOPITEM = $items->create('SHOPITEM');
$product1 = $items->create('Product1', 'Some value 1');
$product2 = $items->create('Product2', 'Some value 2');

//this wont work
$SHOPITEM->add($product1);

//this works
$items->add($product1);
$items->add($product2);

//this works
$items->add($SHOPITEM);

$items->write();

【问题讨论】:

    标签: php xml oop appendchild


    【解决方案1】:

    您的$SHOPITEM$product1$product2 是新添加节点(即DOMElement 类)的实例,因为它们是语句的结果

    return $this->xml->createElement($nodeName, $value);
    

    所以他们只是有一个方法 add($object) 你想在他们身上使用。

    【讨论】:

    • 你能给我建议吗,请,如何重写我的方法,以便我可以使用 add 方法?
    • 据我了解您尝试实现的逻辑(或者至少看起来是这样)您的 Itmes 类应该代表 xml 文档,该文档将包含一个元素 SHOP这将包含一些其他元素。如果是这样,则意味着您拥有带有根元素SHOP 的xmldoc,并且其中只有普通元素,它们都不是容纳其他元素的节点。如果以上所有内容都是您想要的,那么您可以使用add($object) 方法并为其提供一些DOMElement 作为参数。你colud使用你的create方法来准备这些元素。
    • 还有更多的事情:如果你想通过一些包装器操作 xml 结构而不是去实现一个只接受你的抽象的包装器,所以你在添加过程时不需要处理DOMElemets,或创建过程,或其他任何东西。如果不是这样 - 比直接使用普通的 PHP 功能进行 xml 操作。混合使用这两种方法会令人困惑,因为其中一部分变得比另一部分更抽象。
    • 我不能提供一些例子,因为时间紧迫,抱歉。几个小时后,我可能会做到这一点。
    • finall xml的结构应该类似于<shop><SHOPITEM><product1></product1><product2></product2></SHOPITEM></shop>。这主要是为了我的教育目的,这门课对我来说是个好主意,但正如你所写的,也许不是。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2012-07-27
    • 2018-04-11
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多