2010-11-08 5 views
2

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

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

Выходной файл без пробела составляет 1,2 МБ с пробелом 15 Мб.

Я использую:

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

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

Является ли это способом простого вывода моего XML-объекта в качестве правильного XML без всякого бесполезного пробела?

Благодаря

ответ

8

Посмотрите на опции NoIndent: от XML :: Simple страница руководства:

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

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

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

Этот параметр определяет, как пробелы в текстовый контент обрабатывается. Признанные значения для опции:

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

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

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

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

+0

Спасибо большое, что было именно то, что мне нужно –

0

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

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

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

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

+0

Нет, я не думаю, что вы ошибаетесь в том, что имеете проблемы с определением детей с помощью парсера потока. Но я всегда использовал 'XML :: Simple' сам. Чтобы уменьшить размер очень большого потока, я, однако, нашел разумные границы записи, чтобы разбить входной поток, поэтому он не так велик в памяти сразу. – tchrist

+0

Если весь документ действительно вписывается в память, то использование XML :: LibXML будет быстрее, чем большинство других опций. Это связано с тем, что структуры данных DOM управляются кодом C и обычно не так много данных пересекают API-интерфейс C <->. С другой стороны, API SAX требует создания и уничтожения множества структур данных Perl для каждого события. SAX - одна из тех вещей, которая в основном хороша в теории. Если весь документ не помещается в память, тогда XML :: LibXML все равно может быть хорошим вариантом, если вы используете API-интерфейс «pull», предоставляемый XML :: LibXML :: Reader (не то, что я когда-либо делал). –

2

Просто установите параметр NoIndent в вызове XMLout().Пример:

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

Tada!

+0

Вы потрясаете, спасибо, не знаю, как я не видел этого в документации –

Смежные вопросы