Показаны сообщения с ярлыком XML. Показать все сообщения
Показаны сообщения с ярлыком XML. Показать все сообщения

14 мая 2016 г.

True UTF-8 encoding

XML файл в кодировке UTF-8 можно сформировать используя только ASCII и кодируя все национальные символы через &#x0 последовательности. Дешево и сердито. Например, такой подход предложен здесь.

Но, если мы хотим, чтобы XML файл красиво отображался в текстовом редакторе, системе контроля версий и т.п., надо сохранить его в настоящей кодировке UTF-8. Для этого мы добавили в платформу функции WIN1251ToUTF8 и UTF8ToWIN1251, которые принимают на вход два потока и перекодируют данные между ними. В дополнение к ним идут функции ReplaceXMLTags и ExpandXMLTags.

Пример использования см. здесь.

27 дек. 2012 г.

Теперь еще и JSON

Для обмена данными веб-сервера Гедымин с PhoneGap нам понадобится JSON. То ли допилить YAML парсер/райтер до версии 1.2 (а JSON -- это подмножество YAML 1.2), то ли воспользоваться одним из общедоступных свободных парсеров JSON. А еще можно тяжеловесный XML использовать и объекты MSXML для работы с ним. В общем, непонятно пока какой из этих хренов окажется слаще редьки.

11 дек. 2012 г.

YAML vs XML

В плане лаконичности и читабельности YAML чудо, а не формат. Ниже одна и та же информация в XML:
<?xml version="1.0" encoding="utf-8"?>
<GS:GEDEMIN_FILES VERSION="1.0" 
  xmlns:GS="http://gsbelarus.com/gedemin_files">
  <GS:DIRECTORY>
    <GS:NAME>INTL</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
  </GS:DIRECTORY>
  <GS:DIRECTORY>
    <GS:NAME>UDF</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
  </GS:DIRECTORY>
  <GS:DIRECTORY>
    <GS:NAME>HELP</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
  </GS:DIRECTORY>
  <GS:FILE>
    <GS:NAME>gudf.dll</GS:NAME>
    <GS:PATH>UDF</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>101888</GS:SIZE>
    <GS:DATE>2012-11-19T18:05:06</GS:DATE>
    <GS:VERSION>2.5.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fbintl.conf</GS:NAME>
    <GS:PATH>INTL</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>6758</GS:SIZE>
    <GS:DATE>2010-07-22T14:51:12</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fbintl.dll</GS:NAME>
    <GS:PATH>INTL</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>909312</GS:SIZE>
    <GS:DATE>2011-03-23T07:47:08</GS:DATE>
    <GS:VERSION>2.5.1.26242</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fr24rus.chm</GS:NAME>
    <GS:PATH>HELP</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>792209</GS:SIZE>
    <GS:DATE>2002-09-14T14:44:22</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>vbs55.chm</GS:NAME>
    <GS:PATH>HELP</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>492103</GS:SIZE>
    <GS:DATE>2000-06-21T15:51:00</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>gedemin.exe</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>19511296</GS:SIZE>
    <GS:DATE>2012-12-11T14:01:06</GS:DATE>
    <GS:VERSION>2.5.17.7594</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fbembed.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>3772416</GS:SIZE>
    <GS:DATE>2011-03-23T07:47:02</GS:DATE>
    <GS:VERSION>2.5.1.26242</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>firebird.msg</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>148556</GS:SIZE>
    <GS:DATE>2011-03-23T07:43:38</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>ib_util.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>7680</GS:SIZE>
    <GS:DATE>2011-03-23T07:46:02</GS:DATE>
    <GS:VERSION>2.5.1.26242</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>icudt30.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>1568768</GS:SIZE>
    <GS:DATE>2010-07-23T09:03:42</GS:DATE>
    <GS:VERSION>3.0.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>icuin30.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>417792</GS:SIZE>
    <GS:DATE>2010-07-22T15:38:46</GS:DATE>
    <GS:VERSION>3.0.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>icuuc30.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>675840</GS:SIZE>
    <GS:DATE>2010-07-22T15:38:36</GS:DATE>
    <GS:VERSION>3.0.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>midas.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>444928</GS:SIZE>
    <GS:DATE>2010-11-04T00:55:00</GS:DATE>
    <GS:VERSION>15.0.3953.35171</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>midas.sxs.manifest</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>1002</GS:SIZE>
    <GS:DATE>2010-11-21T19:06:48</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>msvcp80.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>554832</GS:SIZE>
    <GS:DATE>2009-07-12T08:55:22</GS:DATE>
    <GS:VERSION>8.0.50727.4053</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>msvcr80.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>632656</GS:SIZE>
    <GS:DATE>2009-07-12T08:55:50</GS:DATE>
    <GS:VERSION>8.0.50727.4053</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>Microsoft.VC80.CRT.manifest</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>1870</GS:SIZE>
    <GS:DATE>2009-07-12T02:10:18</GS:DATE>
  </GS:FILE>
</GS:GEDEMIN_FILES>
и в YAML:
Version: 1
Items: 
  - 
    Type   : Directory
    Name   : INTL
    Exists : True
    Flags  : AlwaysOverwrite
  - 
    Type   : Directory
    Name   : UDF
    Exists : True
    Flags  : AlwaysOverwrite
  - 
    Type   : Directory
    Name   : HELP
    Exists : True
    Flags  : AlwaysOverwrite
  - 
    Type   : File
    Name   : gudf.dll
    Path   : UDF
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 101888
    Date   : 2012-11-19 18:05:06Z
    Version: 2.5.0.0
  - 
    Type   : File
    Name   : fbintl.conf
    Path   : INTL
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 6758
    Date   : 2010-07-22 14:51:12Z
  - 
    Type   : File
    Name   : fbintl.dll
    Path   : INTL
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 909312
    Date   : 2011-03-23 07:47:08Z
    Version: 2.5.1.26242
  - 
    Type   : File
    Name   : fr24rus.chm
    Path   : HELP
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 792209
    Date   : 2002-09-14 14:44:22Z
  - 
    Type   : File
    Name   : vbs55.chm
    Path   : HELP
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 492103
    Date   : 2000-06-21 15:51:00Z
  - 
    Type   : File
    Name   : gedemin.exe
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 19511296
    Date   : 2012-12-11 14:01:06Z
    Version: 2.5.17.7594
  - 
    Type   : File
    Name   : fbembed.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 3772416
    Date   : 2011-03-23 07:47:02Z
    Version: 2.5.1.26242
  - 
    Type   : File
    Name   : firebird.msg
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 148556
    Date   : 2011-03-23 07:43:38Z
  - 
    Type   : File
    Name   : ib_util.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 7680
    Date   : 2011-03-23 07:46:02Z
    Version: 2.5.1.26242
  - 
    Type   : File
    Name   : icudt30.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 1568768
    Date   : 2010-07-23 09:03:42Z
    Version: 3.0.0.0
  - 
    Type   : File
    Name   : icuin30.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 417792
    Date   : 2010-07-22 15:38:46Z
    Version: 3.0.0.0
  - 
    Type   : File
    Name   : icuuc30.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 675840
    Date   : 2010-07-22 15:38:36Z
    Version: 3.0.0.0
  - 
    Type   : File
    Name   : midas.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 444928
    Date   : 2010-11-04 00:55:00Z
    Version: 15.0.3953.35171
  - 
    Type   : File
    Name   : midas.sxs.manifest
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 1002
    Date   : 2010-11-21 19:06:48Z
  - 
    Type   : File
    Name   : msvcp80.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 554832
    Date   : 2009-07-12 08:55:22Z
    Version: 8.0.50727.4053
  - 
    Type   : File
    Name   : msvcr80.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 632656
    Date   : 2009-07-12 08:55:50Z
    Version: 8.0.50727.4053
  - 
    Type   : File
    Name   : Microsoft.VC80.CRT.manifest
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 1870
    Date   : 2009-07-12 02:10:18Z

1 окт. 2012 г.

Первая XML Schema

Первая, собственноручно написанная и от первого до последнего символа набранная в текстовом редакторе XML схема для обмена данными о файлах Гедымина:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://gsbelarus.com/gedemin_files" 
xmlns="http://gsbelarus.com/gedemin_files" 
elementFormDefault="qualified"> 
<xs:element name="GEDEMIN_FILES"> 
 <xs:complexType> 
   <xs:sequence> 
 <xs:element name="DIRECTORY" minOccurs="0" 
   maxOccurs="unbounded"> 
   <xs:complexType> 
 <xs:sequence> 
   <xs:element name="NAME" minOccurs="1" 
     maxOccurs="1"> 
 <xs:simpleType> 
   <xs:restriction base="xs:string"> 
 <xs:minLength value="1"/> 
 <xs:maxLength value="255"/> 
   </xs:restriction> 
 </xs:simpleType> 
   </xs:element> 
   <xs:element name="PATH" minOccurs="0" 
     maxOccurs="1"> 
 <xs:simpleType> 
   <xs:restriction base="xs:string"> 
 <xs:minLength value="1"/> 
 <xs:maxLength value="255"/> 
   </xs:restriction> 
 </xs:simpleType> 
   </xs:element> 
   <xs:element name="EXISTS" type="xs:boolean" 
     minOccurs="0" maxOccurs="1"/> 
   <xs:element name="FLAGS" type="xs:string" 
     minOccurs="0" maxOccurs="1"/> 
 </xs:sequence> 
   </xs:complexType> 
 </xs:element> 
 <xs:element name="FILE" minOccurs="0" 
   maxOccurs="unbounded"> 
   <xs:complexType> 
 <xs:sequence> 
   <xs:element name="NAME" minOccurs="1" 
     maxOccurs="1"> 
 <xs:simpleType> 
   <xs:restriction base="xs:string"> 
 <xs:minLength value="1"/> 
 <xs:maxLength value="255"/> 
   </xs:restriction> 
 </xs:simpleType> 
   </xs:element> 
   <xs:element name="PATH" minOccurs="0" 
     maxOccurs="1"> 
 <xs:simpleType> 
   <xs:restriction base="xs:string"> 
 <xs:minLength value="1"/> 
 <xs:maxLength value="255"/> 
   </xs:restriction> 
 </xs:simpleType> 
   </xs:element> 
   <xs:element name="EXISTS" type="xs:boolean" 
     minOccurs="0" maxOccurs="1"/> 
   <xs:element name="FLAGS" type="xs:string" 
     minOccurs="0" maxOccurs="1"/> 
   <xs:element name="SIZE" type="xs:positiveInteger" 
     minOccurs="0" maxOccurs="1"/> 
   <xs:element name="DATE" type="xs:dateTime" 
     minOccurs="0" maxOccurs="1"/> 
   <xs:element name="VERSION" 
     minOccurs="0" maxOccurs="1"> 
 <xs:simpleType> 
   <xs:restriction base="xs:string"> 
 <xs:pattern value="([0-9]+\.?)+"/> 
   </xs:restriction> 
 </xs:simpleType> 
   </xs:element> 
 </xs:sequence> 
   </xs:complexType> 
 </xs:element> 
   </xs:sequence> 
   <xs:attribute name="VERSION" type="xs:decimal"/> 
 </xs:complexType> 
</xs:element> 
</xs:schema>