0

在学习了如何“正确”取消设置节点之后,我注意到使用 PHP 的 unset() 函数会留下制表符和空格。所以现在我有时在节点之间有这么一大块空白。我想知道 PHP 是否会遍历空格/返回/制表符,以及它是否最终会减慢系统速度。

我也在问是否有一个容易删除未设置留下的空间?

谢谢,瑞安

补充说明:

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

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

4 回答 4

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();
于 2010-09-15T22:00:06.643 回答
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 的答案。既然知道了空格是一个节点,那么你也可以想象将它解析成一个节点会占用一些 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) {}
于 2010-09-15T22:05:51.493 回答
0

实际上是Libxml进行 XML 解析,解析器读取的空格与输入流(或文件)中的每个其他字符相同。大多数 PHP xml API 在底层使用 Libxml(XmlReader、XmlWriter、SimpleXml Xslt、Dom...)——其中一些允许您访问空白(例如 Dom、XmlReader),有些则不允许(例如 SimpleXML)

于 2010-09-15T22:10:04.550 回答
0

快速回答所提出的问题:

我想知道 PHP 是否会遍历空格/返回/制表符,以及它是否最终会减慢系统速度。

不,PHP(或 libxml)并没有真正迭代它。从理论上讲,拥有更多空白会减慢系统速度,尽管它是如此之小以至于无法直接测量。您可以通过从 XML 中删除所有空格来自行测试。它不会让它更快。

我也在问是否有一个容易删除未设置留下的空间?

恐怕不容易。您可以将 SimpleXML 内容导入 DOM 并用于formatOutput完全重塑空白,如另一个答案中所建议的那样,或者您可以使用第三方库来为您完成此操作,但您找不到简单的内置方法要做到这一点。

于 2010-09-16T05:21:30.447 回答