2010-04-06 45 views
0

我正在处理一个新的类来包装XML处理。如果安装了我想让我的类使用simplexml,如果不是,则需要内置的XML函数。任何人都可以给我一些关于骨架类的建议吗?用一堆if语句来抛弃每种方法似乎是“错误的”,并且这看起来似乎会使它几乎不可能正确地测试。XML的PHP​​包装类

任何前期建议将是伟大的!我想说的是these built-in xml functions

+4

仅仅使用SimpleXml,DOM或任何其他可用的XML库有什么问题?另外,你认为什么*内置的XML函数*? – Gordon 2010-04-06 13:34:09

+0

@戈登:如果SimpleXml不可用,我想有一个回退 – 2010-04-06 15:30:25

+0

我不想再重新发明轮子。 – 2010-04-06 15:33:45

回答

1

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

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

或什么的)希望这给你一些想法!

1

我做了它包装的SimpleXML功能的类...带你从那可就......

bXml.class.inc

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