Выгрузка в XML

Материал из GB wiki
Перейти к: навигация, поиск

Понимание процесса преобразования датасета в XML

Датасет в ГБ представляет собой, в общем случае, таблицу, некоторые поля которой могут содержать вложенные таблицы (субсеты).

XML-файл представляет собой данные иерархической структуры.

Процесс преобразования датасета в XML заключается в сопоставлении записям и полям датасета тэгов и атрибутов XML.

Заголовок шаблона

Заголовок шаблона копируется в выходной XML без изменений, все данные кодируются в указанной кодировке

<?xml version="1.0" encoding="utf-8"?> 

Если нужно, чтобы кодировка полученного файла отличалась от используемой в шаблоне, нужно явно указать ее при помощи тэга output. Также при помощи этого тэга можно подключить к результату файл стилей

<?xml version="1.0" encoding="Windows-1251"?> 
<root>
 <output encoding="utf-8" xsl="/img/invoice.xsl">

Имя схемы

Имя схемы используется только для поиске в шаблоне подходящей схемы преобразования, поскольку один шаблон может содержать любое число схем.

Данные в шаблоне могут располагаться двумя способами:

  • Корневой тэг имеет имя, совпадающее с именем схемы
<?xml version="1.0" encoding="Windows-1251"?> 
<Товар>
 <ds2xml>
  • Корневой тэг имеет имя root, его непосредственные потомки имеют имя, совпадающее с именем схемы
<?xml version="1.0" encoding="Windows-1251"?> 
<root>
 <Товар>
  <ds2xml>

При такой структуре можно иметь в одном шаблоне сразу несколько схем с разными именами. Если задано несколько схем с одним именем, они будут обработаны все.

Тэгов ds2xml также может быть несколько - например, они могут описывать разные схемы для разных фильтров. При преобразовании они также будут обработаны все.

Например, по такому шаблону по имени схемы "Товар" для каждой записи датасета будет создано 4 тэга в XML

<?xml version="1.0" encoding="Windows-1251"?> 
<root>
<Товар>
 <ds2xml line="aaa">  <attr tagname="Id" value="Id"/>  </ds2xml>
 <ds2xml line="bbb">  <attr tagname="Id" value="Id"/>  </ds2xml>
</Товар>
<Товар>
 <ds2xml line="ccc">  <attr tagname="Id" value="Id"/>  </ds2xml>
 <ds2xml line="ddd">  <attr tagname="Id" value="Id"/>  </ds2xml>
</Товар>
</root>


Уровни данных

Каждая запись датасета - потомок корневого тэга

Самый простой вариант.

<?xml version="1.0" encoding="Windows-1251"?> 
<Товар>
 <ds2xml line="Товар">
  <attr tagname="Id" value="Id"/>
 </ds2xml>
</Товар>

Будет получен XML такого вида:

<?xml version="1.0" encoding="Windows-1251"?>
<root>
<Товар Id="873"/>
<Товар Id="874"/>
</root>

Название корневого тэга можно изменить, вызвав перед DS2XML функцию SETROOTTAG

Каждая запись датасета - потомок некорневого тэга

В данном случае требуется создать нужную вложенность при помощи тэгов subset, указав в последнем из них fieldname="$$ALL$$"

Шаблон

<?xml version="1.0" encoding="Windows-1251"?> 
<Товар>
 <ds2xml>  
  <subset line="Товары">
   <subset line="Данные" fieldname="$$ALL$$">
    <subset line="Товар">
     <attr tagname="Id" value="Id"/>  
    </subset>
   </subset>
  </subset>
 </ds2xml>
</Товар>

Даст нам в итоге

<?xml version="1.0" encoding="Windows-1251"?>
<root>
<Товары>
 <Данные>
  <Товар Id="873"/>
  <Товар Id="874"/>
 </Данные>
</Товары>
</root>

Корневой тэг в этом случае, как и в предыдущем, можно переименовать. Кроме того, поскольку мы точно знаем, что в этом случае потомок корневого тэга только один, мы можем и удалить корневой тэг функцией REMOVEROOTTAG

Атрибуты и вложенные тэги

Данные из исходного датасета могут быть представлены атрибутами (<Товар Название="товар"/>):

<attr tagname="Название" value="Articul.Name"/>

либо вложенными тэгами (<Товар><Название>товар</Название></Товар>):

<subset line="Название">
 <attr text="Articul.Name"/>
</subset>

Субсеты

Если входной датасет имеет иерархическую структуру, либо есть возможность для каждой записи получить субсет запросом, то можно преобразовать этот субсет во вложенные тэги. Для этого используется конструкция subset fieldname="ИмяПоля" или subset fieldname="=Выражение"

По шаблону

<?xml version="1.0" encoding="Windows-1251"?> 
<Товар>
 <ds2xml line="Товар">
  <attr tagname="Id" value="Id"/>
  <subset fieldname="=Id.BarCodes" line="barcode">
    <attr text="BarCode"/>
  </subset>
 </ds2xml>
</Товар>

Будет получен XML такого вида:

<?xml version="1.0" encoding="Windows-1251"?>
<root>
<Товар Id="873"><barcode>23131323</barcode><barcode>12313242</barcode></Товар>
<Товар Id="874"><barcode>123456767881</barcode><barcode>1234123412344</barcode></Товар>
</root>

Сортировка и фильтрация

Для тэгов ds2xml, а также тэгов subset с заданным fieldname, можно задать сортировку и фильтрацию.

Сортировка задается при помощи атрибута sort="выражение" или вложенного тэга <sort> выражение </sort>

Фильтрация задается при помощи атрибута filter="выражение" или вложенного тэга <filter> выражение </filter>

Сортировка и фильтрация позволяют делать самые сложные преобразования, такие как многоуровневая группировка данных.