XML格式化——简单的XML不会进行漂亮的格式化(缩进格式化)



我正在将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>

然而,如果我尝试使用simplexmldomDocument它不再正确格式化;

下面是问题的示例

$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");

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

首先,您成功地发现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>

最新更新