【问题标题】:How to output in XML version and encoding (PHP)如何以 XML 版本和编码输出 (PHP)
【发布时间】:2018-05-21 18:38:41
【问题描述】:

有一个插件可以形成用于出口商品的 XML 文件。但是无论我怎么努力,我都无法在行首插入代码<?xml version = "1.0" encoding = "utf-8"?>。不幸的是,有必要对文件进行验证。现在产生这种方式:

    <root>
<object>
<objectid></objectid>
<title></title>
<type></type>
...
</object>
<object>...</object>
...
</root>

我不是这个问题的专家,但我只会给出一段可能出现问题的代码:

public function onAjaxBTExport()
        {    
$xml = new SimpleXMLElementExtended('<root/>');
    ....
    $data = $xml->asXML();
    file_put_contents(JPATH_SITE.'/data.xml', $data);
    header('Content-type: text/xml');
    echo  $data;
    die;
    }

    class SimpleXMLElementExtended extends SimpleXMLElement
       {
          private function addCDataToNode(SimpleXMLElement $node, $value = '')
          {
             if ($domElement = dom_import_simplexml($node))
             {
                $domOwner = $domElement->ownerDocument;
                $domElement->appendChild($domOwner->createCDATASection("{$value}"));
             }
          }
          public function addChildWithCData($name = '', $value = '')
          {
             $newChild = parent::addChild($name);
             if ($value) $this->addCDataToNode($newChild, "{$value}");
             return $newChild;
          }
          public function addCData($value = '')
          {
             $this->addCDataToNode($this, "{$value}");
          }
       }

【问题讨论】:

  • “不幸的是,文件验证是必需的”——不应该。这些是默认值。仅当您为其中一个或两个属性使用非默认值时,才需要序言。

标签: php xml simplexml


【解决方案1】:

考虑使用identity tranform 模板运行XSLT(XML 转换语言),该模板按原样复制整个文档,然后将omit-xml-declaration 显式设置为“no”。这样做的额外好处是可以很好地打印您的输出。

要在 PHP 中运行 XSLT 1.0,请务必在 .ini 文件中启用 php-xsl 扩展名。 XSLT 下面作为字符串嵌入,但可以从文件中解析。

$xml = new SimpleXMLElementExtended('<root/>');
... 
$data = $xml->asXML();

// LOAD XML SOURCE
$doc = new DOMDocument;
$doc->loadXML($data);

// LOAD XSLT SOURCE
$xsl = new DOMDocument;
$xsl->loadXML('<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                  <xsl:output version="1.0" encoding="UTF-8" omit-xml-declaration="no" indent="yes" />
                  <xsl:strip-space elements="*"/>

                  <!-- Identity Transform -->
                  <xsl:template match="@*|node()">
                     <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>
                     </xsl:copy>
                  </xsl:template>

               </xsl:transform>');

// CONFIGURE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// RUN TRANSFORMATION
$newXML = $proc->transformToXML($doc);

// ECHO TO CONSOLE
header('Content-type: text/xml');
echo $newXML;

// SAVE TO FILE
file_put_contents(JPATH_SITE.'/data.xml', $newXML);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2016-09-08
    相关资源
    最近更新 更多