Xembly, an Assembly for XML

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Я использую XML в почти всех своих проектах. И, несмотря на всю суету вокруг JSON/YAML, я искренне считаю, что XML - один из самых великих языков, когда-либо созданных. Кроме того, я считаю, что красота XML проявляется, когда он используется в сочетании с смежными технологиями.

Например, вы можете предоставить свои данные в формате XML и отображать их для конечного пользователя с помощью стилевых таблиц XSL.

Еще один пример - когда вы проверяете одни и те же данные перед отображением, чтобы убедиться, что структура правильная. Вы можете сделать это с помощью схемы XSD. В качестве альтернативы, вы можете выбрать конкретные элементы данных из всего документа, используя запросы XPath.

По сути, эти три технологии - XSL, схема XSD и XPath - делают XML настолько мощным.

Однако, бывают моменты, когда XML не справляется. Например, представьте, что у вас есть существующий документ, который нужно немного изменить. Допустим, вот такой:

Вышеприведенный код представляет собой список аккаунтов. Каждый аккаунт имеет свой собственный id и несколько дочерних элементов. В нашем примере нам нужно найти аккаунт, принадлежащий Jeffrey, и увеличить его баланс на 500. Как мы можем это сделать?

Ну, есть несколько возможных решений:

  • DOM-разбери его, найди элемент с помощью XPath, измените значение и затем напечатайте его;

  • применить параметризованную таблицу стилей XSL;

  • применить небольшой скрипт XQuery для внесения изменений

Все эти методы имеют свои недостатки. Однако у них всех есть одна общая проблема - они очень громоздкие. Для выполнения этой довольно простой операции вам потребуется по крайней мере одна страница кода для каждого из вышеупомянутых методов. Более того, если логика операции становится более сложной, количество необходимого кода растет намного быстрее, чем вы могли бы ожидать.

Проще говоря, в XML отсутствует инструмент для примитивной обработки данных внутри документа. Возможно, именно этот недостаток делает XML непопулярным у некоторых людей.

В любом случае, вот инструмент, который я создал несколько месяцев назад: Xembly. Это императивный язык с несколькими простыми директивами и по стилю напоминает Assembly. Вот почему он называется Xembly. В Xembly нет циклов, условий или переменных - только последовательность директив с аргументами.

Давайте создадим простой пример. Скажем, например, мы хотим добавить новый номер счета 36 в наш список документов. Код будет выглядеть так:

Вышеуказанное должно быть интуитивно понятно, но на всякий случай я объясню. Во-первых, директива XPATH указывает на элемент, найденный запросом XPath “/accounts”. Это будет наш корневой элемент. Мы предполагаем, что он существует в документе. Поэтому, если его нет, наш сценарий Xembly завершится с исключением времени выполнения.

Затем, директива ADD в строке 2 создает новый XML-элемент без дочерних элементов или атрибутов. Затем, директива ATTR устанавливает атрибут для этого элемента. Затем код добавляет новый дочерний элемент name и устанавливает его текстовое значение на “Donny” с использованием директивы SET. Наконец, мы перемещаем наш указатель обратно к элементу account с помощью UP, добавляем дочерний элемент balance и устанавливаем его значение на “3400”.

Наша задача изменения баланса может быть выражена в Xembly с помощью следующего кода:

Директива XSET задает значение текста элемента, аналогично директиве SET, но предварительно вычисляет его с использованием предоставленного XPath-выражения . + 500.

Xembly выполняет все манипуляции через DOM. Следовательно, Xembly может быть реализован внутри любого языка, имеющего встроенную реализацию DOM.

В настоящее время существует только одна реализация языка Xembly - на Java. Вот как это работает:

В этом отрывке я использую дополнительный конструктор сценариев Directives, который позволяет генерировать директивы в удобном стиле. Затем я использую класс Xembler, который аналогичен “ассемблеру”, чтобы применить все указанные директивы к объекту document класса org.w3c.dom.Document.

Кроме того, Xembly может использоваться для создания XML-документов с нуля и в качестве замены для традиционного построения DOM. Быстрый пример:

Вышеуказанный фрагмент создает следующий результат:

Для меня это кажется более простым и компактным.

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

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-15 at 06:22

sixnines availability badge   GitHub stars