在学习how to "correctly" unset a node之后,我注意到使用PHP的unset()函数会留下标签和空格。所以现在我有时在节点之间有这么大的空白区域。我想知道PHP是否遍历空格/返回/制表符以及它是否最终会使系统变慢。
我也在问是否有一个很容易删除空间的空间?
谢谢, 莱恩
已添加注意:
这是我在取消设置节点后删除空格的方法,它对我有用。
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load($xmlPath);
$dom->save($xmlPath);
答案 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
完全重新构建空白,如另一个答案中所建议的那样,或者您可以使用第三方库来为您执行此操作,但您不会轻易找到它,内置的方式来做到这一点。