【问题标题】:remove xml version tag when a xml is created in php在 php 中创建 xml 时删除 xml 版本标记
【发布时间】:2011-08-22 07:20:52
【问题描述】:

我正在使用它创建一个 xml

$customXML = new SimpleXMLElement('<abc></abc>');

在添加一些属性之后,当我尝试打印它时 看起来像这样,

<?xml version="1.0"?>
<abc id="332"><params><param name="aa">33</param></params></abc>

有没有办法删除 xml 版本节点? 谢谢

【问题讨论】:

  • 整个序言还是只是版本信息?
  • 为什么?这可能毫无意义,但不应该造成任何伤害。

标签: php xml


【解决方案1】:

一个实用的解决方案:你知道?&gt; 在结果字符串中的第一次出现将是 xml 版本子字符串的结尾。所以:

$customXML = new SimpleXMLElement('<abc></abc>');
$customXML = substr($customXML, strpos($customXML, '?'.'>') + 2);

请注意,?&gt; 被分成两部分,否则一些糟糕的语法高亮可能会在此时出现解析问题。

【讨论】:

    【解决方案2】:

    如果这是一个问题,应该这样做:

    $xml = str_replace(' version="1.0"', '', $xml);`
    

    【讨论】:

      【解决方案3】:

      XML 标头标签和 PHP 短标签不兼容。因此,这可能是在 PHP 中使用短标签的问题(即&lt;?= 而不是&lt;?php echo...)。因此,关闭 PHP.INI 中的短标签(并适当更新您的代码)可能会解决此问题。

      【讨论】:

        【解决方案4】:

        理论上,您可以提供LIBXML_NOXMLDECL option 以在保存文档时删除 XML 声明,但这仅适用于 Libxml >= 2.6.21(和 buggy)。另一种方法是使用

        $customXML = new SimpleXMLElement('<abc></abc>');
        $dom = dom_import_simplexml($customXML);
        echo $dom->ownerDocument->saveXML($dom->ownerDocument->documentElement);
        

        【讨论】:

        • 感谢您的完美回答
        • 小心,这是将非 ASCI 字符转义为 enitites。
        【解决方案5】:

        还有另一种不用替换 xml 标头的方法。我更喜欢这个:

        $xml = new xmlWriter();
        $xml->openMemory();
        $xml->startElement('abc');
        $xml->writeAttribute('id', 332);
        $xml->startElement('params');
        $xml->startElement('param');
        $xml->writeAttribute('name', 'aa');
        $xml->text('33');
        $xml->endElement();
        $xml->endElement();
        echo $xml->outputMemory(true);
        

        给出输出:

        <abc id="332"><params><param name="aa">33</param></params></abc>
        

        【讨论】:

          【解决方案6】:

          对于已接受的答案,我有一个类似的解决方案:

          如果您已经在变量中加载了 xml:

          $t_xml = new DOMDocument();
          $t_xml->loadXML($xml_as_string);
          $xml_out = $t_xml->saveXML($t_xml->documentElement);
          

          对于磁盘中的 XML 文件:

          $t_xml = new DOMDocument();
          $t_xml->load($file_path_to_xml);
          $xml_out = $t_xml->saveXML($t_xml->documentElement);
          

          这条评论有帮助:http://www.php.net/manual/en/domdocument.savexml.php#88525

          【讨论】:

            【解决方案7】:

            由于SimpleXMLElement 总是使用"\n" 将XML-Declaration 与文档的其余部分分开,因此可以在该位置拆分它并取其余部分:

            explode("\n", $customXML->asXML(), 2)[1];
            

            例子:

            <?php
            
            $customXML = new SimpleXMLElement('<!-- some comment -->
            <abc>
            </abc>');
            
            echo explode("\n", $customXML->asXML(), 2)[1];
            

            输出:

            <!-- some comment -->
            <abc>
            </abc>
            

            【讨论】:

              【解决方案8】:

              试试:

              $xmlString = $doc->saveXML();
              $xmlString = str_replace("<?xml version=\"1.0\"?>\n", '', $xmlString);
              file_put_contents($filename, $xmlString);
              

              【讨论】:

                【解决方案9】:
                echo preg_replace("/<\\?xml.*\\?>/",'',$doc->saveXML(),1);
                

                【讨论】:

                • 这几乎正是我正在做的。我的解决方案:return preg_replace( "/&lt;\?xml.+?\?&gt;/", "", $doc-&gt;asXml() );
                【解决方案10】:
                $customXML = new SimpleXMLElement('<source><abc>hello</abc></source>');
                $result = $customXML->xpath('//abc');
                $result = $result[0];
                var_dump($result->asXML());
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-02-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多