Замедляет ли дополнительное пространство процессор? - PullRequest
0 голосов
/ 16 сентября 2010

После изучения , как "правильно" сбросить узел , я заметил, что использование функции unset () в PHP оставляет за собой табуляции и пробелы. Так что теперь у меня есть этот большой кусок пустого пространства между узлами время от времени. Мне интересно, будет ли PHP перебирать пробелы / возвраты / табуляции и будет ли это в конечном итоге замедлять работу системы.

Я также спрашиваю: легко ли убрать пространство, оставленное незаданным?

Спасибо, Райан

ДОБАВЛЕННОЕ ПРИМЕЧАНИЕ:

Вот как я удалил пробелы после сброса узла, и это сработало для меня.

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

Ответы [ 4 ]

3 голосов
/ 16 сентября 2010

Пробелами в 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 для деталей.Теперь, когда вы знаете, что пробел является узлом, вы также можете представить, что его анализ в узле занимает несколько циклов ЦП.Тем не менее, я бы сказал, что скорость воздействия незначительна.Если сомневаетесь, сделайте эталонный тест с некоторыми данными реального мира.


РЕДАКТИРОВАТЬ: Доказательство того, что пробельные символы действительно являются узлами

$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) {}
3 голосов
/ 16 сентября 2010

Не замедляет ли это процесс: возможно, мало о чем беспокоиться.

И 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();
0 голосов
/ 16 сентября 2010

Быстрые ответы на заданные вопросы:

Мне интересно, будет ли PHP перебирать пробелы / возвраты / табуляции и будет ли это в конечном итоге замедлять работу системы.

Нет, PHP (или libxml) на самом деле не перебирает его.Наличие большего пробела теоретически замедляет работу системы, хотя она настолько мала, что не может быть измерена напрямую.Вы можете проверить это самостоятельно, удалив все пробелы из вашего XML.Это не сделало бы это быстрее.

Я также спрашиваю, легко ли убрать пространство, оставленное незаданным позади?

Нет easy как я боюсь.Вы можете импортировать ваши вещи SimpleXML в DOM и использовать formatOutput, чтобы полностью перемоделировать пустое пространство, как предлагается в другом ответе, или вы можете использовать стороннюю библиотеку, которая сделает это за вас, но вы не найдете простой, встроенный-в способ сделать это.

0 голосов
/ 16 сентября 2010

На самом деле Libxml выполняет синтаксический анализ XML, пробел читается синтаксическим анализатором так же, как и любой другой символ во входном потоке (или файле).Большинство API PHP xml используют Libxml под капотом (XmlReader, XmlWriter, SimpleXml Xslt, Dom ...) - некоторые из них дают вам доступ к пробелам (например, Dom, XmlReader), некоторые нет (например, SimpleXML)

...