COREmanager активно использует формат XML, как для взаимодействия с внешними приложениями, так и для передачи данных внутри системы. Очень часто возникает необходимость объединить несколько XML документов в один. Например, это происходит, если вы добавляете в панель свои XML файлы при написании плагинов. Для описания правил, по которым объединяются различные XML, был создан специальный файл — описывающий алгоритм слияния файлов. Объединятся не только узлы различных XML, если XML документ содержит узлы с одинаковым набором ключевых атрибутов, они тоже будут объеденены согласно правилам.

Файлы, описывающие правила должны быть расположены в каталоге /usr/local/mgr5/xmlschema/

Вот небольшая часть этих правил (полностью их можно посмотреть в указанном каталоге):

<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.w3.org/1999/xhtml" xmlns:isp="http://ispsystem.com/schema">
  <metadata key="name" merge="xml" top="yes">
    <include key="name" merge="replace"/>
    <toolbar merge="xml">
      <toolsep merge="no"/>
      <toolbtn key="name" merge="xml" share="toolbtn">
        <show key="name value" merge="replace"/>
        <hide key="name value" merge="replace" share="toolbtn_hide"/>
      </toolbtn>
      <toolgrp key="name" merge="xml">
	 <isp:include name="toolbtn"/>
      </toolgrp>
    </toolbar>
</schema>

Внутри коренного узла schema располагаются узлы с теми же именами, которые используются в наших XML файлах. Атрибуты этих узлов задают правила, по которым они объединяются при объединении XML документов:

атрибут key задает перечень ключевых атрибутов (через пробел может быть перечислено несколько имен). Узлы с таким именем и совпадающими значениями ключевых атрибутов будут объеденены. В результате получается элемент имеющий объединенный набор атрибутов и дочерних элементов. Узлы добавляемые позже имеют приоритет. Например, при объединении следующих узлов с ключевым атрибутом @name, значение атрибута @value будет равно second, так как элемент с этим значением встретился позднее:

<toolbtn name="test" value="first"/>
<toolbtn name="test" value="second"/>

атрибут merge задает тип объединения. Возможные значения:

  • ignore — не объединять узлы с таким именем (атрибут @key в данном случае не анализируется). Такие узлы вставляются в результирующий XML документ без изменений.
  • no — не объединять узлы с таким именем (атрибут @key в данном случае не анализируется). Но, в отличии от ignore, дочерние узлы будут просмотрены и объеденены, если это необходимо.
  • text — объединить содержимое узлов. При объединении содержиммое дочерних узлов просто добавляется к уже существующим. Атрибуты так же объединяются.
  • replace — заменять узлы. Узлы встретившиеся в XML документе последними будут полностью заменять предыдущие версии.
  • xml — объединить. Будут объеденены значения атрибутов и содержимое узлов. Все дочерние текстовые узлы будут удалены.

атрибут root если его значение "yes". Элемент с таким именем может быть корневым узлом XML документа

атрибут share указывает на то, что данное правило может быть использовано позднее в другом контексте при помощи служебного узла isp:include

элемент isp include добавляет в текущий контекст правила помеченные как @share. В атрибуте @name данного узла необходимо указать значение, которое было использовано для атрибута @share. Элемент с соответствующим атрибутом @share должен быть расположен в XML раньше, чем его использование при помощи isp:include