使用DOMDocument以最小化格式保存XML文件

时间:2018-09-10 11:16:40

标签: php html xml

我想通过以最小格式保存xml文件来节省空间

例如

<body>
  <div>
    <p>hello</p>
    <div/>
  </div>
</body>

应该这样保存

<body><div><p>hello</p><div/></div></body>

我正在使用DOMDocument创建这样的xml文件

$xml = new DOMDocument("1.0", "UTF-8");
        $xml->preserveWhiteSpace = false;
        $xml->formatOutput = false;

        $feed = $xml->createElement("feed");
        $feed = $xml->appendChild($feed);
/*add attribute*/
        $feed_attribute        = $xml->createAttribute('xmlns:xsi');
        $feed_attribute->value = 'http://www.w3.org/2001/XMLSchema-instance';
        $feed->appendChild($feed_attribute);
        $aggregator = $xml->createElement("aggregator");
        $aggregator = $feed->appendChild($aggregator);
        $name       = $xml->createElement('name', 'test.com');
        $aggregator->appendChild($name);
...etc
        $xml->save(public_path() .$string, LIBXML_NOEMPTYTAG);

2 个答案:

答案 0 :(得分:3)

您已经在使用正确的选项。 DOMDocument::$formatOutputDOMDocument::$preserveWhiteSpace

格式输出

DOMDocument::$formatOutput将缩进空格节点添加到XML DOM(如果已保存)。 (默认情况下处于禁用状态。)

$document = new DOMDocument();
$body = $document->appendChild($document->createElement('body'));
$div = $body->appendChild($document->createElement('div'));
$div
  ->appendChild($document->createElement('p'))
  ->appendChild($document->createTextNode('hello'));

echo "Not Formatted:\n", $document->saveXML();

$document->formatOutput = TRUE;
echo "\nFormatted:\n", $document->saveXML();

输出:

Not Formatted: 
<?xml version="1.0"?> 
<body><div><p>hello</p></div></body> 

Formatted: 
<?xml version="1.0"?> 
<body>
  <div>
    <p>hello</p>
  </div> 
</body>

但是,如果这是文本子节点,它不会缩进。它试图避免更改HTML / XML文档的文本输出。因此,通常不会使用现有的缩进空格节点重新格式化已加载的文档。

保留空白

DOMDocument::$preserveWhiteSpace是解析器的一个选项。如果禁用(默认情况下启用),则解析器将忽略仅包含空格的任何文本节点。缩进是带有换行符和一些空格或制表符的文本节点。它可用于从XML删除缩进。

$xml = <<<'XML'
<?xml version="1.0"?> 
<body>
  <div>
    <p>hello</p>
  </div> 
</body>
XML;

$document = new DOMDocument();
$document->preserveWhiteSpace = FALSE;
$document->loadXML($xml);
echo $document->saveXML();

输出:

<?xml version="1.0"?> 
<body><div><p>hello</p></div></body>

答案 1 :(得分:-2)

尝试一下,您必须使用saveXML()而不是save(),

<?php

$xml = new DOMDocument('1.0');

$xml->preserveWhiteSpace = false; 
$xml->formatOutput = false;

$root = $xml->createElement('book');
$root = $xml->appendChild($root);

$title = $xml->createElement('title');
$title = $root->appendChild($title);

$text = $xml->createTextNode("This is the \n title");
$text = $title->appendChild($text);

echo "Saving all the document:\n";

$xml_content = $xml->saveXML();
echo $xml_content . "\n";

$xml_content = str_replace(array(">\n", ">\t"), '>', trim($xml_content, "\n"));

echo $xml_content . "\n";

// Write the contents back to the file
$filename = "/tmp/xml_minified.xml";
file_put_contents($filename, $xml_content);
?>