代码之家  ›  专栏  ›  技术社区  ›  Glen Solsberry

XML的Php包装类

  •  0
  • Glen Solsberry  · 技术社区  · 16 年前

    我正在开发一个新类来包装XML处理。如果安装了simplexml,我希望我的类使用simplexml,如果没有安装,则使用内置的XML函数。有谁能给我一些关于骨架类的建议吗?在每个方法中乱扔一堆if语句似乎是“错误的”,而且这似乎也会使正确测试变得几乎不可能。

    编辑 these built-in xml functions .

    3 回复  |  直到 16 年前
        1
  •  1
  •   troelskn    16 年前

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

        2
  •  1
  •   null    16 年前

    我已经创建了一个类来包装SimpleXml功能。。。尽你所能。。。

    bXml.class.inc

    有件奇怪的事。。。SimpleXml不允许其构造函数被重载,所以您不能在初始化时执行操作。。。比如重写输入值(例如,您可以接受XML作为输入)。通过使用ArrayObject类包装新的SimpleXml类,我绕过了这个限制。

        3
  •  0
  •   danp    16 年前

    我使用这样的方法来进行xml翻译和内容:

    假设xml结构是这样的(使用常规结构很重要,这意味着您可以获得一些不错的敏捷技巧!):

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

    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");
        }
    

    或者别的什么;)希望这能给你一些想法!