Как указать имена элементов XML в bpmn-js

Если я определяю файл модуля с помощью bpmn-js, как это

    {
        name: "thisArgument",
        superClass: [
            "Element"
        ],
        properties: []
    },
    {
        name: "myData",
        superClass: [
            "Element"
        ],
        properties: [
            {
                name: "argument",
                type: "thisArgument"
            }
        ]
    },

Тогда результирующий XML (когда я вызову saveXML) будет иметь элемент с именем thisArgument, несмотря на то, что имя является аргументом. Во-первых, это ошибка? Если нет, то как мне управлять выводом, чтобы XML содержал argument, а не thisArgument? Я искал документы и примеры, но не могу найти, как это сделать.

Единственный обходной путь, который я нашел, состоял в том, чтобы сделать его type: "argument", а затем определить argument с суперклассом thisArgument и без дополнительных свойств (по сути, создавая псевдоним). Однако это работает только в том случае, если все экземпляры argument идентичны. Например. если XML должен быть

<A><argument/></A>
<B><argument/></B>

где аргумент в A имеет другую форму, чем аргумент в B, тогда возникнет конфликт, поскольку я не могу определить argument дважды.


person user2740650    schedule 26.02.2021    source источник


Ответы (1)


Я могу отчасти ответить на свой вопрос. Я нашел эту опцию сериализации и поэкспериментировал, и в основном она делает то, что мне нужно, но иногда добавляет нежелательный атрибут xsi:type="originalType", а иногда нет. Может быть, это зависит от isBody, но я не уверен. Если кто-то знает подробности, как это работает, пожалуйста, ответьте.

properties: [
    {
        name: "argument",
        type: "thisArgument",
        xml: {
            serialize: "xsi:type"
        },
    }
]

Самое близкое к документации по нему, что я нашел, это https://forum.bpmn.io/t/bpmn-json-documentation/1304, который описывает его как дополнительные метаданные, влияющие на XML-сериализацию типа, поэтому я был бы признателен за любые дополнительные подробности, которые кто-либо может предоставить.

Обновление: в документах это не упоминается, но оказалось, что serialize: "property" — это именно то, что мне нужно. Это делает то же самое, что и serialize: "xsi:type", но не добавляет атрибут xsi:type.

    xml: {
        serialize: "property"
    },

Я нашел это, ища код в одном из связанных пакетов, moddle-xml.

В write.js есть код, который ищет запись xsi:type или property:

  // allow serialization via type
  // rather than element name
  var asType = serializeAsType(p),
      asProperty = serializeAsProperty(p);

В том же файле я нашел код, объясняющий, почему xsi:type тоже не всегда появлялся:

  // only serialize xsi:type if necessary
  if (descriptor.name === this.propertyDescriptor.type) {
        return attributes;
  }
person user2740650    schedule 27.02.2021
comment
В конце концов нашел это: github.com/bpmn- io/moddle-xml/blob/master/docs/ добавляет дополнительные примечания о сериализации. Поддерживаемые значения: xsi:type сериализуется как тип данных, а не как элемент. Это не объясняет странное поведение xsi:type, которое я обнаружил, и не упоминает опцию "serialize": "property", которую я обнаружил, разыскивая исходный код. - person user2740650; 27.02.2021