XML格式化 - 简单的XML无法进行漂亮的格式化(缩进格式化)

3

我正在将PHP变量转换为XML格式。

我注意到,当我只是使用DOMDocument和以下代码;

$dom->formatOutput = true;

创建XML时,它会正确地进行格式化(即行缩进等)。

仅使用DOMDocument的代码:

$dom = new DOMDocument('1.0','UTF-8');
    $dom->formatOutput = true;

    $root = $dom->createElement('student');
    $dom->appendChild($root);

    $result = $dom->createElement('result');
    $root->appendChild($result);

    $result->setAttribute('id', 1);
    $result->appendChild( $dom->createElement('name', 'Opal Kole') );
    $result->appendChild( $dom->createElement('sgpa', '8.1') );
    $result->appendChild( $dom->createElement('cgpa', '8.4') );

    echo '<xmp>'. $dom->saveXML() .'</xmp>';
    $dom->save('result.xml') or die('XML Create Error');

**结果**

<?xml version="1.0" encoding="UTF-8"?>
<student>
  <result id="1">
    <name>Opal Kole</name>
    <sgpa>8.1</sgpa>
    <cgpa>8.4</cgpa>
  </result>
</student>

然而,如果我尝试使用 domDocumentsimplexml,它将不再正确格式化;以下是问题的示例:
$dom = new domDocument; 

$dom->formatOutput = true;   
$root = $dom->appendChild($dom->createElement( "user" ));    
$sxe = simplexml_import_dom( $dom );     
$sxe->addChild("firstname", "John");    
$sxe->addChild("surname", "Brady"); 

$sxe->asXML('testingXML.xml');

结果:

<?xml version="1.0"?>
<user><firstname>John</firstname><surname>Brady</surname></user>

您会注意到它不再按照所需的方式进行格式化。
我已经按照在线教程示例将简单的xml与dom结合使用,但它们都没有正确格式化。
更新:我尝试了论坛上的许多解决方案,但似乎没有一个适用于我。
不过,我刚刚找到了这个解决方案- 它确实可行- 但是它很冗长。它要求我首先使用SimplyXML保存文件,然后重新加载保存的文件,现在使用DocumentDom再次保存文件。
 $sxe->asXML('simple_xml_create.xml');

    $simplexml = simplexml_load_file("simple_xml_create.xml");
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($simplexml->asXML());
$xml = new SimpleXMLElement($dom->saveXML());


$xml->saveXML("simple_xml_create.xml");

有没有更加优雅的解决方案?


你有搜索过这个特定的问题吗?似乎并没有。在谷歌上有无数的结果,但即使在SO上,你也会发现许多答案都是相同的。 - marekful
可能是Prettifying/Formatting output in SimpleXML的重复问题。 - marekful
我确实尝试过这个:$sxe->asXML('simple_xml_create.xml');$dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($sxe->asXML()); echo $dom->saveXML(); 但是它没有起作用。 - Paul Kendal
可能是PHP simpleXML如何以格式化的方式保存文件?的重复问题。 - cweiske
1个回答

0

首先,您成功地发现了DOMDocument支持格式化XML,而SimpleXMLElement则不支持。这是完全正确的。

因此,您想使用SimpleXMLElement来创建XML文档,但您也想从DOMDocument的格式选项中受益,您可能想了解这两个库是相互兼容的姐妹库。您似乎已经知道了这一点,因为您使用simplexml_import_domDOMNode对象转换为其SimpleXMLElement对象。

然而,您似乎错过了自己已经接近成功的机会。请看以下示例,我从您的问题中复制了它 - 我只在最后添加了一行(并将文件名更改为标准输出,以便它回显文档):

$dom = new domDocument;

$dom->formatOutput = true;
$root = $dom->appendChild($dom->createElement( "user" ));
$sxe = simplexml_import_dom( $dom );
$sxe->addChild("firstname", "John");
$sxe->addChild("surname", "Brady");

$sxe->asXML('php://output');
$dom->save('php://output');

SimpleXMLElement::saveXML() 方法将使用非格式化输出,而 DOMDocument::save() 方法将使用您设置参数的格式:

<?xml version="1.0"?>
<user><firstname>John</firstname><surname>Brady</surname></user>
<?xml version="1.0"?>
<user>
  <firstname>John</firstname>
  <surname>Brady</surname>
</user>

就是这样了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接