Манипуляции с 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