Как минимизировать XML с помощью PHP?

У меня есть php-скрипт, который читает файл XML и изменяет его с помощью SimpleXML. После всех изменений скрипт сохраняет файл (размер ~ 2,8 мб).
Мне нужно загрузить этот XML-файл с помощью jQuery, и это занимает довольно много времени. Есть ли способ сжать/уменьшить размер моего XML-файла, чтобы сократить время загрузки в моем вызове AJAX.

ОБНОВИТЬ:

Файл XML содержит SVG для веб-страницы (большая метаболическая карта), поэтому он должен сохранять все содержимое XML-узлов.


person lanan    schedule 08.08.2011    source источник
comment
Возможно, попробуйте использовать менее избыточный формат, такой как json или даже bson, если вам нужны файлы меньшего размера. если вам нужны еще меньшие размеры файлов, вам нужно создать свой собственный двоичный формат.   -  person Dani    schedule 08.08.2011


Ответы (3)


ИЗМЕНИТЬ ОП ясно дал понять, что речь идет о файле SVG после того, как я написал свой ответ.


Не передавайте 2,5 МБ XML на клиент, если вам не нужно все это на клиенте (и я сомневаюсь, что вам это нужно). Лучшей стратегией является использование XML-файла в качестве базы данных:

  • Создайте прокси-страницу в PHP, которая принимает выражения XPath и возвращает только соответствующие части XML.
  • Используйте jQuery для отправки запросов Ajax, которые извлекают соответствующие части, когда это необходимо (т. е. когда пользователь инициирует действие).
  • Используйте memcached или другой метод кэширования, чтобы предотвратить полный синтаксический анализ XML на сервере для каждого запроса.
  • В зависимости от профиля использования вашего приложения используйте memcached для кэширования отдельных ответов Ajax. Кроме того, установите заголовки кэширования HTTP, чтобы клиент не запрашивал повторно данные, которые все еще действительны.
  • Включите сжатие gzip для ответов PHP Ajax, чтобы сэкономить время ответа и пропускную способность.

Так немного больше работы. но это повысит скорость — вероятно, на несколько порядков.

person Tomalak    schedule 08.08.2011
comment
Мой XML содержит большой SVG, который я загружаю на свою веб-страницу (встроенную) после того, как пользователь отправляет форму (файл SVG изменяется с помощью PHP в соответствии с данными формы). Итак, я думаю, мне абсолютно необходимо все это на клиенте... верно? - person lanan; 08.08.2011
comment
@Shvetusya: Да, это похоже на исключение из правил. ;) Но если это всего лишь графика, зачем вы парсите ее с помощью jQuery? — (Однако рекомендуется включить сжатие gzip для передачи. XML довольно часто повторяется и поэтому хорошо реагирует на сжатие.) - person Tomalak; 08.08.2011
comment
Я должен сделать его масштабируемым, добавить всплывающие подсказки для графических элементов, выделение при наведении курсора мыши и т. д. В основном я искал что-то, что помогло бы мне удалить все пробелы в моем XML, так как я думаю, что это значительно уменьшит размер файла. - person lanan; 08.08.2011
comment
@Shvetusya: Ну, архивирование также поможет с пробелами. Размер файла является проблемой только для передачи, а не для синтаксического анализа. В зависимости от того, как вы создаете SVG (библиотеку?), вы можете попытаться предотвратить создание пробелов в первую очередь? - person Tomalak; 08.08.2011
comment
Итак, я думаю, мне следует попытаться заархивировать XML с помощью PHP ZipArchive, а затем использовать этот метод извлечь в JS. Я не создаю SVG с нуля, а изменяю содержимое существующего файла (без библиотеки SVG), поэтому все пробелы уже есть. - person lanan; 08.08.2011
comment
@Шветуся: Не надо! Я имею в виду прозрачное сжатие HTTP gzip, например: php.net/manual /en/function.ob-gzhandler.php — Это должно немного уменьшить размер ответа и полностью прозрачно для клиента, никаких изменений здесь не требуется. - person Tomalak; 08.08.2011
comment
Хорошо! Спасибо за помощь. Я попробую этот метод, похоже, этого будет достаточно для моего проекта. - person lanan; 08.08.2011
comment
@Shvetusya: Если у вас есть ощутимый успех, мне было бы интересно об этом узнать. Также, если вы этого не сделаете, конечно. - person Tomalak; 09.08.2011

Не передавайте 2,5 МБ XML клиенту — и точка. ДОЛЖЕН быть лучший способ сделать то, что вы пытаетесь сделать. Возможно, вы можете добавить разбиение на страницы, чтобы вам не приходилось загружать все результаты одновременно, а вместо этого можно было отправлять только 20 или около того клиенту по мере необходимости.

Во-вторых, не используйте XML — используйте JSON, так как он будет как минимум на 20% меньше и будет иметь собственный формат для JavaScript, что сократит обработку на стороне клиента.

person Xeoncross    schedule 08.08.2011

Если у кого-то есть веская причина для минимизации строкового XML-документа, вот возможное решение:

/** @var string $indentedXml */
$indentedXml = "...";

$dom = new DOMDocument("1.0");

// Preserve redundant spaces (`true` by default)
$dom->preserveWhiteSpace = false;

// Disable automatic document indentation
$dom->formatOutput = false;

$dom->loadXML($indentedXml);

/** @var string $minifiedXml  */
$minifiedXml = $dom->saveXML();

Документ DOMDocument: https://www.php.net/manual/en/class.domdocument.php

person tomloprod    schedule 09.06.2021