Экспорт данных в формате XML

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

Формат XML на сегодняшний день является стандартом для обмена информацией между различными приложениями. Создадим на Гедымине функцию, которая будет извлекать данные из заданной таблицы и помещать их в XML следующего вида:

  <Table>
    <Name>Имя таблицы</Name>
    <Records>
      <Record>
        <Field>
          <FieldName>Имя поля</FieldName>
          <FieldValue>Значение поля</FieldValue>
        </Field>
        ...
      </Record>
      ...
    </Records>
  </Table>

Данные в XML должны быть представлены в кодировке UTF-8. В этой кодировке первые 128 символов (символы латинского алфавита, цифры, знаки пунктуации и т.п.) совпадают с кодовой таблицей ASCII. Остальные символы передаются с помощью последовательности "&#x0<Code>;", где <Code> -- код символа. Кириллические символы, которые в кодировке Win1251 занимают позиции с C0 по FF, в кодировке UTF-8 имеют номера от 410 до 44F. Исключение составляет большая и малая буква Ё: B8-й и A8-й символ в кодировке Win1251, которым соответствуют символы 451 и 401 из UTF-8.

Напишем вспомогательную функцию, которая будет перекодировать заданную строку из кириллической кодировки Windows-1251 в UTF-8:

function ConvertToUTF8(ByVal S)
  dim R, I, C, K
  R = ""
  for I = 1 to Len(S)
    K = Mid(S, I, 1)
    C = Asc(K)
    if (C >= 192) and (C <= 255) then
      R = R & "&#x0" & Hex(C + &H410 - 192) & ";"
    elseif C = 184 then
      R = R & "&#x0451;"
    elseif C = 168 then
      R = R & "&#x0401;"
    else
      R = R & K     
    end if
  next
  ConvertToUTF8 = R
end function

Теперь, все готово для написания функции, а точнее процедуры, XMLText:

sub XMLText(ByVal ATableName, ByVal AFields, ByVal ACondition, ByVal AddRUID, ByVal AFileName)
  AFields = "," & AFields & ","
 
  dim Creator
  set Creator = new TCreator
 
  dim q , sstr
  set q = Creator.GetObject(nil, "TIBSQL", "")
 
  q.Transaction = gdcBaseManager.ReadTransaction
  q.SQL.Text = "SELECT * FROM " & ATableName
  q.ExecQuery
 
  dim i, XMLBody, f
  XMLBody = "<?xml version=""1.0"" standalone=""yes""?>" & vbCrLf
  XMLBody = XMLBody & "<Data>" & vbCrLf & "<Table>" & vbCrLf & "<Name>" & ATableName & "</Name>" & vbCrLf & "<Records>" & vbCrLf
  while not q.EOF
    if ACondition > "" then
      f = Eval(ACondition)
    else
      f = True
    end if
 
    if f then
      XMLBody = XMLBody & "<Record>" & vbCrLf
      for i = 0 to q.Current.Count - 1
        if InStr(1, AFields, "," & q.Fields(i).Name & ",", 1) <> 0 then
          if not q.Fields(i).IsNull then
            XMLBody = XmlBody & "<Field>" & vbCrLf & "<FieldName>" & q.Fields(i).Name & "</FieldName>" & vbCrLf
            XMLBody = XmlBody & "<FieldValue>" & q.Fields(i).AsString & "</FieldValue>" & vbCrLf & "</Field>" & vbCrLf
          end if
        end if
      next
 
      if AddRUID then
        XMLBody = XMLBody & "<Field>" & vbCrLf & "<FieldName>" & "RUID" & "</FieldName>" & vbCrLf
        XMLBody = XmlBody & "<FieldValue>" & gdcBaseManager.GetRUIDStringByID(q.FieldByName("ID").AsInteger) & "</FieldValue>" & vbCrLf & "</Field>" & vbCrLf
      end if
 
      XMLBody = XMLBody & "</Record>" & vbCrLf
    end if
 
    q.Next
  wend
  XMLBody = XMLBody & "</Records>" & vbCrLf & "</Table>" & vbCrLf & "</Data>" & vbCrLf
 
  Dim fso, tf
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set tf = fso.CreateTextFile(AFileName, True)
  tf.Write (ConvertToUTF8(XMLBody))
  tf.Close
end sub

Входящие параметры:

ATableName
имя таблицы в базе данных.
AFields
список полей для экспорта (имена полей должны быть разделены запятыми).
ACondition
выражение на языке VBScript для отбора записей. Если ACondition равно пустой строке, то в XML файл будут перенесены все записи из таблицы. Внутри выражения можно обращаться к переменной q, типа TIBSQL, которая содержит текущую запись. Например, выражение q.FieldbyName(“disabled”).AsInteger = 0 позволит отобрать только активные записи. При условии, конечно, что в указанной таблице присутствует поле с именем disabled.
AddRUID
булевский параметр. Если имеет значение Истина, то для каждой записи будет указан ее RUID.
AFileName
имя файла, в который будет записан результат.

Примерный результат выполнения функции:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
  <Table>
    <Name>gd_good</Name>
    <Records>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100612</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>"Анжелика" печать плат. документов</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100613</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Секрет Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100614</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Анжелика-Бухгалтер"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100615</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Зарплата Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100616</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Средства Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100617</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Меню Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100618</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Комплекс Анжелики" +</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100619</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Аренда Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100620</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Книга покупок и продаж"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100621</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Маршруты Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100622</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Договор Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100623</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Анжелика Турист"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100624</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "СТО Анжелики"</FieldValue>
        </Field>
      </Record>
      <Record>
        <Field>
          <FieldName>ID</FieldName>
          <FieldValue>147100625</FieldValue>
        </Field>
        <Field>
          <FieldName>NAME</FieldName>
          <FieldValue>Программа "Хранитель Анжелики"</FieldValue>
        </Field>
      </Record>
    </Records>
  </Table>
</Data>
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты