【问题标题】:Turn OFF self-closing tags in SimpleXML for PHP?关闭 SimpleXML for PHP 中的自闭合标签?
【发布时间】:2008-11-03 19:53:33
【问题描述】:

我正在使用 PHP 的 SimpleXML 扩展构建一个 XML 文档,并且我正在向文件中添加一个标记:

$doc->addChild('myToken');

这会生成(我所知道的)一个自关闭或单个标签:

<myToken/>

但是,我正在与之通信的老化的 Web 服务正在绊倒自闭标签,所以我需要有一个单独的开始和结束标签:

<myToken></myToken>

问题是,除了通过 preg_replace 运行生成的 XML 之外,我该怎么做?

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    根据SimpleXMLElement->__constructLibXML Predefined Constants 的文档,我认为这应该可行:

    <?php
    $sxe = new SimpleXMLElement($someData, LIBXML_NOEMPTYTAG);
    
    // some processing here
    
    $out = $sxe->asXML();
    ?>
    

    试试看它是否有效。否则,恐怕是 preg_replace-land。

    【讨论】:

      【解决方案2】:

      如果您将值设置为空值(即 null、空字符串),它将使用开/关括号。

      $tag = '<SomeTagName/>';
      
      echo "Tag: '$tag'\n\n";
      
      $x = new SimpleXMLElement($tag);
      echo "Autoclosed: {$x->asXML()}\n";
      
      $x = new SimpleXMLElement($tag);
      $x[0] = null;
      echo "Null: {$x->asXML()}\n";
      
      $x = new SimpleXMLElement($tag);
      $x[0] = '';
      echo "Empty: {$x->asXML()}\n";
      

      查看示例:http://sandbox.onlinephpfunctions.com/code/10642a84dca5a50eba882a347f152fc480bc47b5

      【讨论】:

        【解决方案3】:

        目前,无法避免使用 LibXML 的自闭合标签。 @Piskvor 提出的解决方案之一将不起作用:

        LIBXML_NOEMPTYTAG 不适用于 simplexml,正如提到的 here:

        This option is currently just available in the DOMDocument::save and DOMDocument::saveXML functions.
        

        解决方法是使用来自this question的答案

        【讨论】:

        • 这似乎是对现有答案的回应,而不是对问题的回答,因此应在该答案下添加为评论。
        【解决方案4】:

        可能不是最好的解决方案,但遇到了同样的问题,并通过使用 pre_replace 将所有自闭合标签更改为完整形式来解决它...

        $xml_reader = new XMLReader;
        $xml_reader->open($xml_file);
        
        $data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML());
        

        【讨论】:

          【解决方案5】:

          LIBXML_NOEMPTYTAG 有效,但前提是您使用 DOMDocument::saveDOMDocument::saveXML

          $dom = dom_import_simplexml(SimpleXMLElement)->ownerDocument;
          $dom->formatOutput = true;
          $dom->save($save_path, LIBXML_NOEMPTYTAG);
          

          【讨论】:

            猜你喜欢
            • 2013-11-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-04
            • 2023-03-09
            相关资源
            最近更新 更多