2010-04-06 44 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類來解決這個限制。