我想通过以最小格式保存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);
答案 0 :(得分:3)
您已经在使用正确的选项。 DOMDocument::$formatOutput
和DOMDocument::$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);
?>