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 では (おそらく XPath 経由で) Text ノードに簡単にアクセスできないと思いますが、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

質問への簡単な回答:

PHP が空白/リターン/タブを反復処理するかどうか、および最終的にシステムの速度が低下するかどうか疑問に思っています。

いいえ、PHP (または libxml) は実際には反復しません。空白が多いと、理論的にはシステムの速度が低下しますが、非常に小さいため直接測定することはできません。XML からすべての空白を削除することで、自分でテストできます。それはそれを速くしません。

また、設定されていないスペースを簡単に削除できるかどうかも尋ねていますか?

簡単な方法ではありません。別の回答で示唆されているように、SimpleXML のものを DOM にインポートしformatOutputて空白を完全に改造するために使用するか、それを行うサードパーティのライブラリを使用することができますが、簡単な組み込みの方法は見つかりません。それをするために。

于 2010-09-16T05:21:30.447 に答える
0

XML 解析を行うのは実際にはLibxmlであり、空白は入力ストリーム (またはファイル) 内の他のすべての文字と同じようにパーサーによって読み取られます。ほとんどの PHP xml API は内部で Libxml を使用します (XmlReader、XmlWriter、SimpleXml Xslt、Dom...) - 空白にアクセスできるもの (Dom、XmlReader など) もあれば、そうでないもの (SimpleXML など) もあります。

于 2010-09-15T22:10:04.550 に答える