额外的空间会减慢处理器的速度吗?

时间:2010-09-15 21:43:50

标签: php xml simplexml whitespace unset

在学习how to "correctly" unset a node之后,我注意到使用PHP的unset()函数会留下标签和空格。所以现在我有时在节点之间有这么大的空白区域。我想知道PHP是否遍历空格/返回/制表符以及它是否最终会使系统变慢。

我也在问是否有一个很容易删除空间的空间?

谢谢, 莱恩

已添加注意:

这是我在取消设置节点后删除空格的方法,它对我有用。

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load($xmlPath);
$dom->save($xmlPath);

4 个答案:

答案 0 :(得分:3)

它会减慢这个过程:可能很少关心。

simpleXML就是这么简单。如果您需要“漂亮”输出,DOM就是您的朋友:

<?php
$xml = '
<xml>
        <node>foo </node>
        <other>bar</other>
</xml>';
$x = new SimpleXMLElement($xml);
unset($x->other);
echo $x->asXML();

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml);
$dom->documentElement->removeChild($dom->documentElement->lastChild);
echo $dom->saveXML();

答案 1 :(得分:3)

XML中的空格是TextNodes,例如

<foo>
    <bar>baz</bar>
</foo>

真的是

<foo><- whitespace node
    -><bar>baz</bar><- whitespace node
-></foo>

如果删除<bar>节点,则会获得

<foo><- whitespace node
    -><- whitespace node
-></foo>

我认为SimpleXml不允许您轻松访问Text节点(可能通过XPath),但DOM确实如此。有关详细信息,请参阅Wrikken's answer。既然你知道空白是一个节点,你也可以想象将它解析成一个节点会占用一些cpu周期。但是,我认为速度影响可以忽略不计。如有疑问,请使用一些真实世界数据进行基准测试。


编辑:证明空白是真正的节点

$xml = <<< XML
<foo>
    <bar>baz</bar>
</foo>
XML;

$dom = new DOMDocument;
$dom->loadXML($xml);
foreach($dom->documentElement->childNodes as $node) {
    var_dump($node);
}

给出

object(DOMText)#4 (0) {}
object(DOMElement)#6 (0) {}
object(DOMText)#4 (0) {}

答案 2 :(得分:0)

实际上Libxml执行XML解析,解析器读取的空格与输入流(或文件)中的每个其他字符相同。大多数PHP xml API都使用了Libxml(XmlReader,XmlWriter,SimpleXml Xslt,Dom ...) - 其中一些可以访问空白(例如Dom,XmlReader),有些则不能(例如SimpleXML)

答案 3 :(得分:0)

问题的快速回答:

  

我想知道PHP是否会迭代   空格/返回/制表符以及是否   它最终会放慢速度   系统

不,PHP(或libxml)并没有真正迭代它。有更多的空白理论上会减慢系统的速度,虽然它太小但却无法直接测量。您可以通过从XML中删除所有空格来自行测试。它不会让它变得更快。

  

我也在问是否有   容易去除空间未设置的叶子   后面?

没有简单的方式我害怕。您可以将SimpleXML内容导入DOM并使用formatOutput完全重新构建空白,如另一个答案中所建议的那样,或者您可以使用第三方库来为您执行此操作,但您不会轻易找到它,内置的方式来做到这一点。