用于XML的Php包装类

时间:2010-04-06 13:31:44

标签: php xml class

我正在开发一个新的类来包装XML处理。我希望我的类在安装时使用simplexml,如果不安装则使用内置的XML函数。谁能给我一些关于骨架类的建议呢?使用一堆if语句乱丢每个方法似乎“错误”,而且看起来似乎也几乎无法正确测试。

任何前期建议都会很棒!

编辑:我在谈论these built-in xml functions

3 个答案:

答案 0 :(得分:1)

您指的是哪些内置xml函数? SimpleXml是一个标准扩展,它使用下面的libxml - 就像dom扩展一样。因此,如果安装了dom扩展,那么SimpleXml可能也是如此。

答案 1 :(得分:1)

我已经创建了一个包含SimpleXml功能的类......从中获取可能的内容......

bXml.class.inc

有一个奇怪的事情......就是SimpleXml不允许它的构造函数被重载,所以你不能在启动时做事...就像覆盖输入值(即所以你可以接受XML,如同输入)。我通过使用ArrayObject类来包装新的SimpleXml类来解决这个限制。

答案 2 :(得分:0)

我使用这样的东西来做xml翻译和内容:

假设xml结构是这样的(使用常规结构很重要,意味着你可以实现一些很好的敏捷技巧!):

<word name="nameofitem">
    <en>value</en>
    <pt>valor</pt>
    <de>value_de</de>
</word>

然后是一个处理xml的类:

class translations
{

    public $xml = null;

    private $file = null;
    private $dom = null;



    function __construct($file="translations")  {
        // get xml

        $this->file = $file;

        $this->haschanges = false;

        $this->xml = file_get_contents($_SERVER['DOCUMENT_ROOT']."/xml/".$file.".xml");
        $this->dom = new DOMdocument();

        $this->dom->loadXML($this->xml);
    }

    function updateNode($toupdate, $newvalue, $lang="pt",$rootnode="word"){

        $this->haschanges = true;

        $nodes = $this->dom->getElementsByTagName($rootnode);
        foreach ($nodes as $key => $value) {
            if ($value->getAttribute("name")==$toupdate) {

                $nodes->item($key)->getElementsByTagName($lang)->item(0)->nodeValue = htmlspecialchars($newvalue,ENT_QUOTES,'UTF-8');
            }
        }
    }


    function saveUpdated(){
        $toSave =  $this->dom->saveXML();
        if ($this->haschanges === true) {
            file_put_contents($_SERVER['DOCUMENT_ROOT']."/xml/".$this->file.".xml", $toSave);
            return true;
        }
        else {
            return false;
        }
    }

}

为了简洁起见,我拿出了一些方法,但是我也将这些方法用于处理文件和图像上传等。

完成所有这些后,您就可以:

$xml = new translations();
    // loop through all the language posts
    foreach ($_POST["xml"]["en"] as $key => $value) {
        $xml->updateNode($key, stripslashes($value), "en");
    }

或某事;)希望这会给你一些想法!