【问题标题】:Php wrapper class for XMLXML 的 PHP 包装类
【发布时间】:2010-04-06 13:31:44
【问题描述】:

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

任何前期建议都会很棒!

编辑:我说的是these built-in xml functions

【问题讨论】:

  • 只使用 SimpleXml、DOM 或任何其他可用的 XML 库有什么问题?另外,您如何看待内置 XML 函数
  • @Gordon:如果 SimpleXml 不可用,我想要一个后备
  • 我不会费心重新发明轮子。
  • 简单使用SimplePie,随心所欲,时间就是黄金! simplepie.org

标签: php xml class


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我已经创建了一个包含 SimpleXml 功能的类……你可以从中获取什么……

    bXml.class.inc

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

    【讨论】:

      【解决方案3】:

      我用这样的东西来做 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");
          }
      

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

      【讨论】:

        猜你喜欢
        • 2010-09-07
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2011-06-22
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        相关资源
        最近更新 更多