Дескриптор виртуального токена для расширяемого языка разметки (VTD-XML) относится к набору кроссплатформенных технологий обработки XML, основанных на неэкстрактивном [1] [2] XML , методе анализа, ориентированном на документы, который называется виртуальным дескриптором токена (VTD). ). В зависимости от точки зрения VTD-XML можно рассматривать как одно из следующих:
- " Документоцентричный " [3] [4] XML- синтаксический анализатор [5] [6] [7]
- Собственный индексатор XML или формат файла, который использует двоичные данные для улучшения текста XML [8]
- Добавочный модификатор содержимого XML
- XML-слайсер / разделитель / ассемблер [9]
- Редактор / ластик XML
- Способ переноса обработки XML на чип [10] [11] [12]
- Неблокирующий оценщик XPath без сохранения состояния [13]
Разработчики) | XimpleWare |
---|---|
Стабильный выпуск | 2.12 / 19 ноября 2015 г . |
Операционная система | Портативный |
Платформа | Java, C #, C и C ++ |
Тип | Библиотека парсера / индексатора / среза / редактора XML |
Лицензия | GPL и проприетарная лицензия |
Веб-сайт | vtd-xml |
VTD-XML разработан XimpleWare и имеет двойную лицензию под GPL и проприетарную лицензию. Первоначально он был написан на Java , но теперь доступен на C , [14] C ++ и C # .
Основная концепция
Неизвлекающий анализ, ориентированный на документы
Традиционно лексический анализатор представляет лексемы (небольшие единицы неделимых символьных значений) как дискретные строковые объекты. Этот подход называется экстрактивным анализом. В отличие от этого , несырьевых лексемизацию предписывает , что один держит исходный текст нетронутым, и использует смещения и длины , чтобы описать эти маркеры.
Дескриптор виртуального токена
Виртуальный дескриптор токена ( VTD ) применяет концепцию неэкстрактивного, ориентированного на документы синтаксического анализа к обработке XML. Запись VTD использует 64-битное целое число для кодирования смещения, длины, типа токена и глубины вложения токена в XML-документе. Поскольку все записи VTD имеют длину 64 бита, их можно эффективно хранить и управлять ими как массивом. [15]
Кеш местоположения
Кеши местоположения ( LC ) основаны на записях VTD для обеспечения эффективного произвольного доступа. Организованные в виде таблиц с одной таблицей для каждого уровня глубины вложенности, LC содержат записи, моделирующие иерархию элементов XML-документа. Запись LC - это 64-битное целое число, кодирующее пару 32-битных значений. Старшие 32 бита идентифицируют запись VTD для соответствующего элемента. Младшие 32 бита идентифицируют первого дочернего элемента этого элемента в LC на следующем более низком уровне вложенности.
Преимущества
Обзор
Практически все основные преимущества VTD-XML присущи неэкстрактивному, ориентированному на документы синтаксическому анализу, который обеспечивает следующие характеристики:
- Исходный текст XML сохраняется в памяти без декодирования.
- Внутреннее представление VTD-XML по своей сути является постоянным .
- Устраняет объектно-ориентированное моделирование иерархического представления, поскольку оно полностью полагается на примитивные типы данных (например, 64-битные целые числа) для представления иерархии XML, тем самым снижая стоимость создания объекта почти до нуля. [16]
Сочетание этих характеристик позволяет рассматривать XML исключительно как синтаксис (биты, байты, смещения, длины, фрагменты, фрагменты с компенсацией пространства имен и состав документа) вместо сериализации / десериализации объектов. Это мощный способ думать о приложениях XML / SOA .
Соответствие
VTD-XML строго соответствует XML 1.0 (кроме части DTD) и XML Namespace 1.0. Он по существу соответствует спецификации XPath 1.0 (с некоторыми тонкими различиями в терминах базовой модели данных) с расширением встроенных функций XPath 2.0.
Простота
Как парсер
При использовании в режиме синтаксического анализа VTD-XML является универсальным высокопроизводительным [17] анализатором XML, который выгодно отличается от других:
- VTD-XML обычно превосходит SAX (с обработчиком содержимого NULL), при этом обеспечивая полный произвольный доступ и встроенную поддержку XPath . [ необходима цитата ]
- VTD-XML обычно потребляет в 1,3-1,5 раза размер XML-документа в памяти, что составляет примерно 1/5 от объема памяти, используемого DOM [ необходима ссылка ]
- Приложения, написанные на VTD-XML, обычно намного короче и чище, чем их версии DOM или SAX. [ необходима цитата ]
Как индексатор
Из-за присущей VTD-XML устойчивости разработчики могут записывать внутреннее представление проанализированного XML-документа на диск, а затем перезагружать его, чтобы избежать повторного синтаксического анализа. С этой целью XimpleWare представила VTD + XML как двоичный формат упаковки, объединяющий VTD, LC и текст XML. Обычно его можно просмотреть одним из следующих двух способов:
- Собственный XML-индекс, который полностью исключает затраты на синтаксический анализ, а также сохраняет все преимущества XML. Это формат файла, который удобен для чтения и обратно совместим с XML. [ необходима цитата ]
- Двоичный XML формат , который использует двоичные данные для улучшения обработки текста XML.
Модификатор содержимого XML
Поскольку VTD-XML сохраняет текст XML в неизменном виде без декодирования, когда приложение намеревается изменить содержимое XML, ему нужно изменить только те части, которые наиболее важны для изменений. Это резко контрастирует с синтаксическим анализом DOM, SAX или StAx, который требует затрат на синтаксический анализ и повторную сериализацию независимо от того, насколько малы изменения.
Поскольку VTD ссылаются на элементы документа по их смещению, изменения длины элементов, происходящие ранее в документе, требуют корректировки VTD со ссылкой на все последующие элементы. Однако эти корректировки представляют собой целочисленные добавления, хотя и ко многим целым числам в нескольких таблицах, поэтому они выполняются быстро.
XML-слайсер / разделитель / ассемблер
Приложение, основанное на VTD-XML, также может использовать смещения и длины для адресации токенов или фрагментов элементов. Это позволяет манипулировать документами XML как массивами байтов.
- В качестве слайсера VTD-XML может « вырезать » токен или фрагмент элемента из XML-документа, а затем вставить его обратно в другое место того же документа или в другой документ.
- В качестве разделителя VTD-XML может разделять подэлементы в XML-документе и выгружать каждый из них в отдельный XML-документ.
- В качестве ассемблера VTD-XML может « вырезать » фрагменты из нескольких XML-документов и собирать их в новый XML-документ.
Редактор / ластик XML
VTD-XML, используемый в качестве редактора / ластика, может напрямую редактировать / стирать нижележащее байтовое содержимое XML-текста при условии, что длина токена шире, чем предполагаемое новое содержимое. Непосредственным преимуществом этого подхода является то, что приложение может немедленно повторно использовать исходный VTD и LC. Напротив, при использовании VTD-XML для инкрементного обновления XML-документа приложению необходимо повторно проанализировать обновленный документ, прежде чем приложение сможет его обработать.
Редактора можно сделать достаточно умным, чтобы отслеживать местоположение каждого токена, позволяя новым, более длинным токенам заменять существующие, более короткие токены, просто обращаясь к новому токену в отдельной памяти вне той памяти, которая использовалась для хранения исходного документа. Точно так же при изменении порядка документа текст элемента не нужно копировать; нужно обновлять только LC. Когда требуется полный непрерывный XML-документ, например, при его сохранении, разрозненные части могут быть повторно собраны в новый непрерывный документ.
Другие преимущества
VTD-XML также является пионером в использовании неблокирующего подхода к оценке XPath без сохранения состояния. [ необходима цитата ]
Слабые стороны
VTD-XML также имеет несколько заметных недостатков:
- Как синтаксический анализатор XML он не поддерживает внешние объекты, объявленные в DTD.
- В качестве формата файла он увеличивает размер документа примерно на 30–50%.
- В качестве API он несовместим с DOM , SAX или StAX .
- Трудно поддерживать определенные методы проверки, используемые DTD и XML-схемой (например, атрибуты и элементы по умолчанию), которые требуют модификации анализируемых экземпляров XML.
Области применения
Универсальная замена DOM или SAX
Из-за преимуществ VTD-XML в производительности и памяти он охватывает большую часть вариантов использования XML, чем DOM или SAX. [18]
- По сравнению с DOM, VTD-XML обрабатывает XML-документы большего размера (в 3–5 раз) при том же объеме физической памяти, что примерно в 3–10 раз превышает производительность.
- По сравнению с SAX, VTD-XML обеспечивает произвольный доступ и поддержку XPath и превосходит SAX как минимум в 2 раза.
XPath поверх огромных XML-документов
Расширенная версия VTD-XML в сочетании с 64-разрядной JVM делает возможной обработку XML на основе XPath огромных XML-документов (до 256 ГБ) размером.
Для безопасности SOA / WS / XML
Сочетание высокой производительности VTD-XML и возможности инкрементного обновления делает необходимым [19] [20] [21] достижение желаемого уровня качества обслуживания для приложений безопасности SOA / WS / XML.
Для посредника SOA / WS / XML
VTD-XML хорошо подходит для промежуточных приложений SOA, таких как XML-маршрутизаторы / коммутаторы / шлюзы, корпоративные служебные шины и точки агрегации служб. Все эти приложения выполняют базовые операции «хранить и пересылать», для которых сохранение исходного XML критично для минимизации задержки. Возможность инкрементного обновления VTD-XML также значительно повышает производительность пересылки.
Возможности произвольного доступа VTD-XML хорошо подходят для маршрутизации / коммутации / фильтрации XML на основе XPath, которые обычно используются при развертывании AJAX и SOA.
Интеллектуальная балансировка нагрузки и разгрузка SOA / WS / XML
Когда XML-документ проходит через несколько компонентов SOA среднего уровня, первая остановка сообщения, после завершения проверки XML-документа, может выбрать отправку формата файла VTD + XML нижестоящим компонентам, чтобы избежать повторного синтаксического анализа, тем самым повышая пропускную способность.
Точно так же интеллектуальный балансировщик нагрузки SOA может выбрать генерацию VTD + XML для входящих / исходящих сообщений SOAP, чтобы разгрузить синтаксический анализ XML с серверов приложений, которые получают эти сообщения.
Хранилище данных сохраняемости XML
Если смотреть с точки зрения сохраняемости собственного XML, VTD-XML можно использовать как удобочитаемый, простой в использовании XML-индекс общего назначения. XML-документы, хранящиеся таким образом, могут быть загружены в память для запроса, обновления или редактирования без дополнительных затрат на синтаксический анализ / повторную сериализацию.
Связывание XML-данных без схемы
Сочетание VTD-XML с высокой производительностью, низким потреблением памяти и эффективной оценкой XPath делает возможным новый подход к привязке данных XML, полностью основанный на XPath. Самым большим преимуществом этого подхода является то, что он больше не требует схемы XML, позволяет избежать ненужного создания объектов и использует присущее XML свободное кодирование. [22]
Стоит отметить, что привязка данных, обсуждаемая в упомянутой выше статье, должна быть реализована приложением: сам VTD-XML предлагает только аксессоры. В этом отношении VTD-XML сам по себе не является решением для привязки данных (в отличие от JiBX, JAXB, XMLBeans), хотя он предлагает функции извлечения для пакетов привязки данных, как и другие анализаторы XML ( DOM , SAX , StAX ).
Основные классы
Начиная с версии 2.11, версии VTD-XML для Java и C # состоят из следующих классов:
- VTDGen (генератор VTD ) - это класс, который инкапсулирует основные функции синтаксического анализа, загрузки индекса и записи индекса.
- VTDNav ( VTD Navigator) - это класс, который (1) инкапсулирует XML, VTD и иерархическую информацию, (2) содержит различные методы навигации, (3) выполняет различные сравнения между записями и строками VTD и (4) преобразует записи VTD в примитивные типы данных.
- AutoPilot - это класс, содержащий функции, которые выполняют итерацию на уровне узла и XPath.
- XMLModifier - это класс, который предлагает возможность инкрементного обновления, такого как удаление, вставка и обновление.
Расширенный VTD-XML состоит из следующих классов:
- VTDGenHuge (расширенный генератор VTD ) инкапсулирует основной синтаксический анализ.
- XMLBuffer выполняет загрузку XML-документов в память.
- XMLMemMappedBuffer выполняет загрузку документов XML с отображением памяти.
- VTDNavHuge (расширенный навигатор VTD ) 1) инкапсулирует XML, расширенный VTD и иерархическую информацию, (2) содержит различные методы навигации, (3) выполняет различные сравнения между записями и строками VTD и (4) преобразует записи VTD в примитивные типы данных.
- AutoPilotHuge выполняет итерацию на уровне узлов и XPath.
Пример кода
/ * В этой java-программе мы демонстрируем, как использовать XMLModifier для постепенного * обновления простого заказа на покупку XML. * конкретное пространство имен. Мы также собираемся * использовать parseFile VTDGen для упрощения программирования. * /import com.ximpleware. * ;public class Update { public static void main ( String argv [] ) выбрасывает NavException , ModifyException , IOException { // открываем файл и считываем содержимое в массив байтов VTDGen vg = new VTDGen (); if ( vg . parseFile ( "oldpo.xml" , true )) { VTDNav vn = vg . getNav (); Автопилот ap = новый Автопилот ( вн ); XMLModifier xm = новый XMLModifier ( вн ); ap . selectXPath ( "/ PurchaseOrder / items / item [@ partNum = '872-AA']" ); int i = - 1 ; в то время как (( i = ap . evalXPath ()) ! = - 1 ) { xm . удалить (); хм . insertBeforeElement ( "<что-то /> \ n" ); } ap . selectXPath ( "/ PurchaseOrder / items / item / USPrice [. <40] / text ()" ); в то время как (( i = ap . evalXPath ()) ! = - 1 ) { xm . updateToken ( i , «200» ); } хм . вывод ( "newpo.xml" ); } } }
Рекомендации
- ↑ Чжан, Джимми (19 мая 2004 г.). «Неэкстрактивный анализ XML» . XML.com . Проверено 24 июля 2020 .
- ^ Обработка XML для будущего
- ^ Чжан, Джимми (9 января 2008 г.). «Управляйте содержимым XML Ximple Way» . DevX . Проверено 24 июля 2020 .
- ^ Чжан, Джимми (24 июня 2008 г.). «VTD-XML: Обработка XML для будущего (Часть II)» . Код проекта . Проверено 24 июля 2020 .
- ^ Чжан, Джимми (27 марта 2006 г.). «Упростите обработку XML с помощью VTD-XML» . JavaWorld . Проверено 24 июля 2020 .
- ^ Чжан, Джимми (21 октября 2004 г.). «Лучшая и быстрая обработка XML с помощью VTD-XML» . DevX . Проверено 24 июля 2020 .
- ^ Чжан, Джимми (17 апреля 2008 г.). «VTD-XML: Обработка XML для будущего (Часть I)» . Код проекта . Проверено 24 июля 2020 .
- ^ Чжан, Джимми (2 ноября 2007 г.). «Индексирование XML-документов с помощью VTD-XML» . Публикации SYS-CON. Архивировано из оригинала на 2007-11-05.
- ^ Чжан, Джимми (24 июля 2006 г.). «Вырезать, вставлять, разделять и собирать XML-документы с помощью VTD-XML» . JavaWorld . Проверено 24 июля 2020 .
- ^ XML на микросхеме?
- ^ Чжан, Джимми (9 марта 2005 г.). «XML на чипе» . XML.com . Проверено 24 июля 2020 .
- ^ Документ с изложением позиции семинара по бинарному XML XimpleWare W3C
- ^ Чжан, Джимми (19 марта 2007 г.). «Повышение эффективности XPath с помощью VTD-XML» . DevX . Проверено 24 июля 2020 .
- ^ Фолькман, Виктор (3 декабря 2007 г.). «VTD-XML: новое видение XML» . Developer.com . Проверено 24 июля 2020 .
- ^ Введение в дескриптор виртуального токена на SourceForge
- ^ Чжан, Джимми (31 июля 2006 г.). «Горе производительности двоичного XML» . Публикации SYS-CON. Архивировано из оригинала на 2006-08-08.
- ^ Отчет о производительности парсинга / навигации VTD-XML
- ^ Чжан, Джимми (8 февраля 2006 г.). «Шаг в правильном направлении: VTD-XML улучшает обработку XML» . DevX . Проверено 24 июля 2020 .
- ^ Чжан, Джимми (9 января 2007 г.). «Ускорение приложений WSS с помощью VTD-XML» . JavaWorld . Проверено 24 июля 2020 .
- ^ Презентация семинара W3C по безопасности XML
- ^ Позиционный документ для семинара W3C о следующих шагах для подписи XML и шифрования XML
- ^ Чжан, Джимми (10 сентября 2007 г.). «Связывание данных Java-XML без схемы с VTD-XML» . ONJava . Архивировано из оригинала на 2017-09-27.