xml格式 - 简单的xml不做相当格式化(缩进格式)

时间:2015-08-12 15:19:10

标签: php 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>

但是,如果我尝试将 simplexml domDocument 一起使用,则它不再正确格式化;

下面是问题的一个示例

$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结合在一起的在线教程示例,但没有一个正确格式化。

更新

我尝试了很多针对forumns的解决方案,但似乎并不适用于我。

然而,我刚刚找到了这个解决方案 - 它确实有效 - 然而,它长期啰嗦。它要求我首先使用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");

是否有更优雅的解决方案?

1 个答案:

答案 0 :(得分:0)

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

因此,您希望使用 SimpleXMLElement 来实际创建XML文档,但您也希望从 DOMDocument 的格式设置选项中受益,您可能希望了解这一事实这两个库都是姐妹库,彼此之间的关系非常好。当您使用simplexml_import_dom DOMNode 对象转换为 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>

那已经是。