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