如何获得由PHP生成的XML所需的确切缩进?

问题描述 投票:0回答:1

如何获得由PHP生成的XML缩进格式?

我正在尝试从PHP生成带有特定缩进的XML文件,如下所示:

我尝试模仿的模型:

<?xml version="1.0" encoding="UTF-8"?>
<sound
    firmwareVersion="3.0.1"
    earliestCompatibleFirmware="3.0.0"
    polyphonic="mono"
    voicePriority="1"
    mode="subtractive"
    lpfMode="24dB"
    modFXType="none">
    <osc1
        type="saw"
        transpose="0"
        cents="0"
        retrigPhase="-1" />
    <osc2
        type="square"
        transpose="-22"
        cents="0"
        retrigPhase="-1" />

因此,我使用了SimpleXML + prettyXML,我可以为元素而不是属性获得格式良好的格式。我四处张望,找不到用SimpleXML或DOMDocument打破属性界线的方法。

我的带有SimpleXML的代码如下:

$xml_header = '<?xml version="1.0" encoding="UTF-8"?><sound></sound>';
$sound = new SimpleXMLElement($xml_header);

  $sound->addAttribute('firmwareVersion', "3.0.1");
  $sound->addAttribute('earliestCompatibleFirmware', "3.0.0");
  $sound->addAttribute('polyphonic', "$polyphonic");
  $sound->addAttribute('voicePriority', "1");
  $sound->addAttribute('mode', "substractive");
  $sound->addAttribute('lpfMode', "$lpfmode");

  $sound->addAttribute('modFXType', "$modFXType");

  $osc1 = $sound->addChild('osc1');
  $osc1->addAttribute('type', "$osc1type");
  $osc1->addAttribute('transpose', "$osc1transpose");
  $osc1->addAttribute('cents', "$osc1cents");
  $osc1->addAttribute('retrigPhase', "-1");

  $osc2 = $sound->addChild('osc2');
  $osc2->addAttribute('type', "$osc2type");
  $osc2->addAttribute('transpose', "$osc2transpose");
  $osc2->addAttribute('cents', "$osc2cents");
  $osc2->addAttribute('retrigPhase', "-1");

  $lecho = $sound->saveXML();

而且我对DomDocument的尝试看起来像这样:

$domtree = new DOMDocument('1.0', 'UTF-8');
$sound = $domtree->appendChild($domtree->createElement("sound"));

$firmwareVersion = $domtree->createAttribute('firmwareVersion');
$firmwareVersion->value = '3.0.1';
$sound->appendChild($firmwareVersion);

$earliestCompatibleFirmware = $domtree->createAttribute('earliestCompatibleFirmware');
$earliestCompatibleFirmware->value = '3.0.0';
$sound->appendChild($earliestCompatibleFirmware);

$osc1 = $sound->appendChild($domtree->createElement("osc1"));

$osc1Attributes = $domtree->createAttribute('type');
$osc1Attributes->value = 'square';
$osc1->appendChild($osc1Attributes);

结果总是看起来像下面,我知道可以用,但是对于普通读者来说是难以理解的,并且与原始文档不符。我确实希望能够在属性中插入换行符,但找不到方法。我试图将reserveWhiteSpace = false;和formatOutput = true;使用PrettyXML库在任何地方都没有用。

我得到了什么(osc1和osc2元素已正确缩进,但我是菜鸟,无法在此处显示此内容:]

<sound firmwareVersion="3.0.1" earliestCompatibleFirmware="3.0.0" polyphonic="mono" voicePriority="1" mode="substractive" lpfMode="24dB" modFXType="chorus" airtime-extension-installed="true">
<osc1 type="saw" transpose="0" cents="0" retrigPhase="-1"/>
<osc2 type="square" transpose="-22" cents="0" retrigPhase="-1"/>

任何帮助将不胜感激。简介:我能够获取元素的缩进,但不能获取属性。这主要是我需要实现的一个装饰性目标:D

php xml format simplexml
1个回答
0
投票

您可以使用ext/tidy或实现自己的序列化(遍历DOM并生成XML字符串)。

© www.soinside.com 2019 - 2024. All rights reserved.