Манипуляции с XML

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Формат данных XML поддерживает манипуляции с атрибутами и дочерними элементами XML.

Атрибуты

Проверка наличия атрибутов в XML

import static io.openbpm.spin.Spin.XML;

String xml = "<order xmlns:cam=\"http://camunda.org/example\" id=\"order1\" cam:name=\"name\" />";

boolean hasAttr = XML(xml).hasAttr("id");
assertTrue(hasAttr);

hasAttr = XML(xml).hasAttrNs("http://camunda.org/example", "id");
assertTrue(hasAttr);

Чтение атрибутов из XML

import static io.openbpm.spin.Spin.XML;

SpinXmlDomAttribute attribute = XML("<order id=\"order1\" />").attr("id");
String id = XML("<order id=\"order1\" />").attr("id").value();

Метод attr возвращает обёртку над XML-атрибутом, а метод value позволяет получить значение атрибута.

Для доступа к атрибуту в другом пространстве имён используйте метод attrNs.

import static io.openbpm.spin.Spin.XML;

String xml = "<order xmlns:cam=\"http://camunda.org/example\" id=\"order1\" cam:name=\"order1\" />";

SpinXmlDomAttribute attribute = XML(xml).attrNs("http://camunda.org/example", "name");

Также можно получить коллекцию всех атрибутов или только атрибутов определённого пространства имён.

import static io.openbpm.spin.Spin.XML;

String xml = "<order xmlns:cam=\"http://camunda.org/example\" id=\"order1\" cam:name=\"order1\" />";

// Все атрибуты
SpinCollection<SpinXmlDomAttribute> attributes = XML(xml).attrs();

// Все атрибуты определённого пространства имён
attributes = XML(xml).attrs("http://camunda.org/example");

Или можно сразу получить только имена всех атрибутов.

import static io.openbpm.spin.Spin.XML;

String xml = "<order xmlns:cam=\"http://camunda.org/example\" id=\"order1\" cam:name=\"order1\" />";

// Все имена атрибутов
List<String> names = XML(xml).attrNames();

// Все имена атрибутов определённого пространства имён
names = XML(xml).attrNames("http://camunda.org/example");

Запись атрибутов в XML

Новое значение атрибута можно задать напрямую через обёртку элемента или через обёртку атрибута.

import static io.openbpm.spin.Spin.XML;

String xml = "<order id=\"order1\" />";

XML(xml).attr("id", "newId");

SpinXmlDomAttribute attribute = XML(xml).attr("id");
attribute.value("newId");

Также можно указать пространство имён устанавливаемого атрибута.

import static io.openbpm.spin.Spin.XML;

String xml = "<order xmlns:cam=\"http://camunda.org/example\" id=\"order1\" cam:name=\"name\" />";

XML(xml).attrNs("http://camunda.org/example", "name", "newName");

SpinXmlDomAttribute attribute = XML(xml).attrNs("http://camunda.org/example", "name");
attribute.value("newName");

Удаление атрибутов из XML

Атрибут можно удалить непосредственно из элемента или через сам объект атрибута.

import static io.openbpm.spin.Spin.XML;

String xml = "<order id=\"order1\" />";

SpinXmlDomElement element = XML(xml).removeAttr("id");
assertFalse(element.hasAttr("id"));

SpinXmlDomAttribute attribute = XML(xml).attr("id");
element = attribute.remove();
assertFalse(element.hasAttr("id"));

Также можно указать пространство имён удаляемого атрибута.

import static io.openbpm.spin.Spin.XML;

String xml = "<order xmlns:cam=\"http://camunda.org/example\" id=\"order1\" cam:name=\"name\" />";

SpinXmlDomElement element = XML(xml).removeAttrNs("http://camunda.org/example", "name");
assertFalse(element.hasAttrNs("http://camunda.org/example/", "name"));

SpinXmlDomAttribute attribute = XML(xml).attrNs("http://camunda.org/example", "name");
element = attribute.remove();
assertFalse(element.hasAttrNs("http://camunda.org/example", "name"));

Текстовое содержимое

Текстовое содержимое XML-элемента можно читать и изменять с помощью метода textContent.

import static io.openbpm.spin.Spin.XML;

SpinXmlDomElement element = XML("<customer>Foo</customer>");
assertEquals("Foo", element.textContent());
element.textContent("Bar");

Дочерние элементы

Чтение дочерних элементов из XML

Помимо атрибутов, можно получить уникальный или все дочерние элементы определённого типа. Опционально пространство имён можно передать первым параметром метода.

import static io.openbpm.spin.Spin.XML;

String xml = "<order xmlns:cam=\"http://camunda.org/example\">" +
      "<date/><cam:due/><item/><item/><cam:op/><cam:op/></order>";

SpinXmlDomElement date = XML(xml).childElement("date");
SpinXmlDomElement due = XML(xml).childElement("http://camunda.org/example", "due");

SpinCollection<SpinXmlDomElement> items = XML(xml).childElements("item");
SpinCollection<SpinXmlDomElement> ops = XML(xml).childElements("http://camunda.org/example", "ops");

Добавление дочерних элементов

Метод append используется для добавления одного или нескольких дочерних элементов к XML-элементу.

import static io.openbpm.spin.Spin.XML;

SpinXmlTreeElement root = XML("<root/>");

SpinXmlTreeElement child1 = XML("<child/>");
SpinXmlTreeElement child2 = XML("<child/>");
SpinXmlTreeElement child3 = XML("<child/>");

root.append(child1, child2, child3);

Удаление дочерних элементов

Для удаления дочерних элементов из XML-элемента используется метод remove. Он принимает один или несколько дочерних элементов и удаляет их из родительского элемента.

import static io.openbpm.spin.Spin.XML;

SpinXmlTreeElement root = XML("<root><child/><child/><child/></root>");

root.remove(root.childElements("child"));

Замена элементов

Для замены элемента или дочернего элемента используются методы replace и replaceChild.

import static io.openbpm.spin.Spin.XML;

SpinXmlTreeElement root = XML("<root><date/><order/></root>");

SpinXmlTreeElement child1 = XML("<child/>");
root.replaceChild(root.childElement("date"), child1);

SpinXmlTreeElement child2 = XML("<child/>");
root.childElement("order").replace(child2);

Манипуляции с XML с использованием скриптового языка

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

xml = """
<order id="1231">
  <item id="1"/>
</order>
"""

assert S(xml).hasAttr('id')

order_id = S(xml).attr('id').value()
assert order_id == '1231'

element = S(xml).attr('order', 'order1')
assert element.hasAttr('order')
assert element.Attr('order').value() == 'order1'

element.removeAttr('order')
assert not element.hasAttr('order')

item_id = S(xml).childElement('item').attr('id').value()
assert item_id == '1'

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org