Какова Самая Эффективная Основанная на Java потоковая передача Процессор XSLT? [закрытый]

На мой взгляд, лучший способ вообще запретить SQL-инъекцию в вашем PHP-приложении (или любом веб-приложении, если на то пошло) - это думать о архитектуре вашего приложения. Если единственный способ защитить от SQL-инъекции - не забудьте использовать специальный метод или функцию, которая делает The Right Thing каждый раз, когда вы разговариваете с базой данных, вы делаете это неправильно. Таким образом, это просто вопрос времени, пока вы не забудете правильно отформатировать свой запрос в какой-то момент вашего кода.

Принятие шаблона MVC и структуры, такой как CakePHP или CodeIgniter - это, вероятно, правильный путь: общие задачи, такие как создание безопасных запросов к базе данных, были решены и централизованно реализованы в таких рамках. Они помогают организовать ваше веб-приложение разумным образом и заставляют вас больше думать о загрузке и сохранении объектов, а не о безопасном построении отдельных SQL-запросов.

27
задан Thorbjørn Ravn Andersen 16 May 2012 в 08:24
поделиться

3 ответа

В настоящее время известно только три процессора XSLT 2.0 и из них Saxon 9.x , вероятно, наиболее эффективен ( по крайней мере, по моему опыту) как по скорости, так и по использованию памяти. Saxon-SA (версия Saxon с поддержкой схемы, не бесплатная, как версия B (базовая)), имеет специальные расширения для потоковой обработки.

Из различных существующих процессоров XSLT 1.0 , .NET XslCompiledTransform (на основе C #, не Ява!) Кажется чемпионом.

В мире процессоров XSLT 1.0 на основе Java Saxon 6.x снова довольно хорош.

ОБНОВЛЕНИЕ :

Теперь, более чем через 3 года после того, как на этот вопрос был первоначально дан ответ, нет никаких доказательств того, что разница в эффективности между упомянутыми процессорами XSLT изменилась .

Что касается потоковой передачи :

  1. XML-документ с «миллионами узлов» вполне может быть обработан даже без какой-либо потоковой передачи . Я провел эксперимент, в котором Saxom 9.1.07 обработал XML-документ, содержащий около миллиона элементов 3-го уровня с целочисленными значениями. Преобразование просто вычисляет их сумму. Общее время преобразования на моем компьютере составляет менее 1,5 секунд. Использованная память была 500 МБ - то, что ПК мог иметь даже 10 лет назад,

Вот информационные сообщения Саксона, которые показывают детали о преобразовании:

Saxon 9.1.0.7J from Saxonica
Java version 1.6.0_17
Stylesheet compilation time: 190 milliseconds
Processing file:/C:\temp\delete\MRowst.xml
Building tree for file:/C:\temp\delete\MRowst.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 1053 milliseconds
Tree size: 3075004 nodes, 1800000 characters, 0 attributes
Loading net.sf.saxon.event.MessageEmitter
Execution time: 1448 milliseconds
Memory used: 506661648
NamePool contents: 14 entries in 14 chains. 6 prefixes, 6 URIs
  1. Saxon 9.4 имеет функцию расширения saxon: stream () , которая может использоваться для обработки огромных документов XML.

Вот выдержка из документации :

В Саксонии есть два основных способа потоковой передачи:

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

Этот подход хорошо работает для файлов, которые являются довольно плоскими по структуре, например, файл журнала, содержащий миллионы записей журнала, где обработка каждой записи журнала не зависит от тех, что были раньше.

Вариант этого метода использует новую инструкцию XSLT 3.0 xsl: iterate для итерации по записям вместо xsl: for-each. Это позволяет поддерживать рабочие данные в процессе обработки записей: это позволяет, например, выводить итоговые или средние значения в конце цикла или сделать обработку одной записи зависимой от того, что было до нее в файле , Инструкция xsl: iterate также позволяет досрочно выйти из цикла, что позволяет преобразованию обрабатывать данные из начала большого файла без фактического чтения всего файла.

Потоковая передача в режиме пакетной передачи доступна как в XSLT, так и в XQuery, но в XQuery нет эквивалента конструкции xsl: iterate.

Потоковые шаблоны: этот подход следует традиционному шаблону обработки XSLT, заключающемуся в выполнении рекурсивного спуска входной иерархии XML путем сопоставления правил шаблона с узлами на каждом уровне, но делает это по одному элементу за раз, без построения дерева в памяти . [+1132]

Каждый шаблон принадлежит режиму (возможно, режим по умолчанию, безымянный режим), а потоковая передача - это свойство режима, которое можно указать с помощью нового объявления xsl: mode. Если режим объявляется потоком, то каждое правило шаблона в этом режиме должно подчиняться правилам обработки потока.

Правила для того, что разрешено в потоковой обработке, довольно сложны, но существенный принцип заключается в том, что шаблонное правило для данного узла может читать потомков этого узла только один раз, по порядку. Существуют и другие правила, налагаемые ограничениями в текущей реализации Saxon: например, хотя использование группировки теоретически согласуется с поточной реализацией, в настоящее время она не реализована в Saxon.

  1. XSLT 3.0 будет иметь стандартную функцию потоковой передачи . Тем не менее, документ W3C все еще имеет статус «рабочий черновик», и спецификация потоковой передачи, вероятно, изменится в последующих черновых версиях. Из-за этого не существует никаких реализаций текущей черновой (потоковой) спецификации.

  2. Предупреждение : Не каждое преобразование может быть выполнено в потоковом режиме - независимо от процессора XSLT. Одним из примеров преобразования, которое невозможно выполнить в потоковом режиме (с ограниченным объемом ОЗУ) для больших документов, является сортировка их элементов (скажем, по общему атрибуту).

31
ответ дан Burkart 28 November 2019 в 05:23
поделиться

Вы могли рассмотреть STX, реализация Java которого Joost. Так как это подобно XSLT, но быть потоковым процессором это в состоянии обработать огромные файлы с помощью очень небольшого количества RAM.

Joost в состоянии использоваться в качестве стандарта javax.xml.transform. TransformerFactory

8
ответ дан Stephen Denne 28 November 2019 в 05:23
поделиться

См. Поддержку Saxon для потокового режима. http://www.saxonica.com/html/documentation/sourcedocs/streaming/

Если этот режим потоковой передачи не для вас, вы можете попробовать использовать крошечное дерево режим Saxon, который оптимизирован для меньшего использования памяти. (Это все равно по умолчанию)

3
ответ дан Community 28 November 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: