Как мне сжать XML из XML :: Simple :: XMLout? - PullRequest
2 голосов
/ 08 ноября 2010

Я использую XML :: Simple для анализа и редактирования очень большого файла XML, и скорость очень важна (до сих пор из всех методов, которые я пробовал, XML :: Simple был самым быстрым)

Сейчаскак только все мои изменения завершены, я печатаю XML в документ, используя XMLout (), хотя он печатает его с правильным отступом, что было бы хорошо, если бы его читали люди, но совершенно бесполезно в моей ситуации.

ВыводФайл без пробелов - 1,2 Мб, с пробелами - 15 Мб.

Я использую:

my $string = XMLout($data);
$string =~ s/>[\s]*</></g;
print $out $string;

Но, похоже, это не только чрезмерная загрузка процессора, но и огромныеобъем памяти, который нужно сделать.

Это способ просто вывести мой объект XML в виде правильного XML без лишних пробелов?

Спасибо

Ответы [ 3 ]

8 голосов
/ 08 ноября 2010

Посмотрите на параметр NoIndent: из XML :: Простая man-страница:

NoIndent => 1 # out - редко используется

Установите для этого параметра значение 1, чтобы отключить "XMLout ()"по умолчанию режим" красивая печать ".Если эта опция включена, все выходные данные XML будут находиться в одной строке (если в данных нет новых строк) - это может быть проще для последующей обработки.

NormaliseSpace => 0 │ 1 │ 2 # - удобно

Этот параметр определяет способ обработки пробелов в текстовом содержимом.Допустимые значения для этого параметра:

  • 0 = (по умолчанию). Пробельные символы пропускаются без изменений (за исключением, конечно, нормализации пропусков в значениях атрибутов, что предписывается рекомендацией XML)

  • 1 = пробел нормализуется в любом значении, используемом в качестве хэш-ключа (нормализация означает удаление начальных и конечных последовательностей пробельных и свернутых пробельных символов в один пробел)

  • 2 = пробел нормализуется во всем текстовом содержимом

    Примечание: вы можете записать эту опцию с 'z', если это более естественно для вас.

2 голосов
/ 08 ноября 2010

Просто установите опцию NoIndent в вызове XMLout (). Как это:

my $string = XMLout($data, NoIndent=>1);

Тад!

0 голосов
/ 08 ноября 2010

XML-анализатор, управляемый событиями, будет работать быстрее, чем что-то, что должно загрузить все вещи в память за один раз.

Вы не должны делать так много дополнительной работы в своем шаблоне!Попробуйте вместо этого:

$string =~ s/>\s+</></g;
...