Кто-нибудь, у кого есть частичный XSD, который описывает раздел METADATA XML-файлов Delphi TClientDataSet?

Я знаю, что вы не можете полностью описать XML, который TClientDataSet со схемой XSD, так как элементы ROW имеют атрибуты, имена которых меняются в зависимости от содержимого.

Тем не менее, раздел METADATA такого XML должен быть.

Итак: есть ли у кого-нибудь (частичный) XSD, описывающий часть METADATA XML, которая может быть сохранена с Delphi TClientDataSets?

С уважением.

PS:

Спасибо за указатели на XML->XSD инструменты для конвертации / сайты; Я должен был написать, что сам это тоже сделал, но для правильной генерации этого XSD (то есть того, который охватывает все возможности) потребуется входной XML, который охватывает все возможности (например, roundtrip, rowstate и т. Д.). Я постараюсь придумать приличный XSD и выложить здесь.

3 ответа

Решение

Редактировать:
Разделите XSD на две части и сделайте его более полным, используя эти файлы в Delphi XE: dsconst.h, dspickle.h, dsxml.h,
Пожалуйста, PM или комментарий, если у вас есть дополнения.

Файлы XSD, представленные ниже, похоже, пока работают достаточно; если у вас есть TClientDataSet XML, который не проверяется с этим, пожалуйста, напишите мне ваш XML (введите Google me или оставьте комментарий ниже для моего почтового адреса).

Сначала файл CDS.xsd, который включает в себя файл CDS_METADATA_FIELDS_include.xsd далее.
Он определяет базовую структуру XML-документа TClientDataSet: DATAPACKET, содержащий METADATA а также ROWDATA, где METADATA содержит FIELDS а также PARAMS, а также ROWDATA содержит ROW элементы:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="CDS_METADATA_FIELDS_include.xsd"/>
    <!-- DATAPACKET/datapacket -->
    <xs:element name="DATAPACKET" type="datapacket"/>
    <xs:complexType name="datapacket">
        <xs:sequence>
            <xs:element ref="METADATA"/>
            <xs:element ref="ROWDATA"/>
        </xs:sequence>
        <xs:attribute name="Version" type="xs:NMTOKEN" use="required"/>
    </xs:complexType>
    <!-- METADATA/metadata -->
    <xs:element name="METADATA" type="metadata"/>
    <xs:complexType name="metadata">
        <xs:sequence>
            <xs:element ref="FIELDS"/>
            <xs:element ref="PARAMS"/>
        </xs:sequence>
    </xs:complexType>
    <!-- PARAMS/params -->
    <xs:element name="PARAMS" type="params"/>
    <xs:complexType name="params">
        <xs:attribute name="MD_FIELDLINKS" type="xs:string" use="optional"/>
        <xs:attribute name="DEFAULT_ORDER" type="xs:positiveInteger"/>
        <xs:attribute name="LCID" type="xs:positiveInteger"/>
        <xs:attribute name="CHANGE_LOG" type="xs:string" use="optional"/>
        <xs:attribute name="PRIMARY_KEY" type="xs:positiveInteger" use="optional"/>
    </xs:complexType>
    <!-- ROWDATA/rowdata -->
    <xs:element name="ROWDATA" type="rowdata"/>
    <xs:complexType name="rowdata">
        <xs:sequence>
            <xs:element ref="ROW" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <!-- ROW/row -->
    <xs:element name="ROW" type="row"/>
    <xs:complexType name="row">
        <xs:sequence>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="RowState" type="xs:NMTOKEN" use="optional"/>
        <xs:anyAttribute namespace="##any" processContents="lax"/>
    </xs:complexType>
</xs:schema>

Обратите внимание, что ROW элементы очень слабо типизированы, так как они будут содержать имена атрибутов, которые определяются динамически.

Тогда файл CDS_METADATA_FIELDS_include.xsd который содержит основные метаданные, используемые FIELDS а также PARAMS элементы.
Он еще не полностью завершен, поскольку я не нашел XML-файлов CDS, содержащих ключевые слова, упомянутые в комментариях ниже.

<?xml version="1.0" encoding="UTF-8"?>
<!-- include portion of the METADATA FIELDS that CDS uses -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <!-- FIELDS/fields -->
  <xs:element name="FIELDS" type="fields"/>
  <xs:complexType name="fields">
    <xs:sequence>
      <xs:element ref="FIELD" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!-- FIELD/field -->
  <xs:element name="FIELD" type="field"/>
  <xs:complexType name="field">
    <xs:sequence>
      <xs:element ref="PARAM" minOccurs="0"/>
      <!-- FIELDS is for nested datasets -->
      <xs:element ref="FIELDS" minOccurs="0" maxOccurs="unbounded"/>
      <!-- PARAMS is for nested datasets -->
      <xs:element name="PARAMS" type="fieldParams" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <!-- fieldname is used when the DBMS allows for non-identifier characters (like spaces) in fieldnames -->
    <xs:attribute name="fieldname" use="optional" type="xs:string"/>
    <xs:attribute name="fieldtype" use="required" type="FIELDTYPE"/>
    <xs:attribute name="SUBTYPE" use="optional" type="subtype"/>
    <!-- DECIMALS is for BCD -->
    <xs:attribute name="DECIMALS" type="xs:positiveInteger" use="optional"/>
    <!-- WIDTH is for Character, BCD, Bytes and Unicode -->
    <xs:attribute name="WIDTH" type="xs:positiveInteger" use="optional"/>
    <xs:attribute name="attrname" type="xs:Name" use="required"/>
<!-- need to incorporate these; probably as attributes as FIELD :
#define szUNIQUE_KEY          "UNIQUE_KEY"
#define szSERVER_COL          "SERVER_COL"
#define szCONSTRAINTS         "CONSTRAINTS"
#define szDATASET_CONTEXT     "DATASET_CONTEXT"
#define szDATASET_DELTA       "DATASET_DELTA"
#define szREADONLY            "READONLY"
#define szBDEDOMX             "BDEDOMAIN_X"
#define szBDERECX             "BDERECORD_X"
#define szBDEDEFX             "BDEDEFAULT_X"
#define szAUTOINCVALUE        "AUTOINCVALUE"
#define szELEMENTS            "ELEMENTS"
#define szTABLENAME           "TABLENAME"
#define szTYPENAME            "TYPENAME"
#define szUPDATEMODE          "UPDATEMODE"
#define szMD_SEMANTICS        "MD_SEMANTICS"
#define szCALCULATED          "CALCULATED"
#define szFIELDNAME          "FIELDNAME"
-->
  </xs:complexType>
  <!-- fieldParams -->
  <xs:complexType name="fieldParams">
    <xs:attribute name="DEFAULT_ORDER" type="xs:positiveInteger"/>
    <xs:attribute name="PRIMARY_KEY" type="xs:positiveInteger"/>
    <xs:attribute name="LCID" type="xs:positiveInteger"/>
  </xs:complexType>
  <!-- FIELDTYPE -->
  <xs:simpleType name="FIELDTYPE">
    <xs:restriction base="xs:Name">
      <!-- observed in real life CDS XML: -->
      <xs:enumeration value="byte"/>
      <!-- from Delphi XE file dsxml.h: -->
      <xs:enumeration value="i1"/>
      <xs:enumeration value="i2"/>
      <xs:enumeration value="i4"/>
      <xs:enumeration value="i8"/>
      <xs:enumeration value="ui1"/>
      <xs:enumeration value="ui2"/>
      <xs:enumeration value="ui4"/>
      <xs:enumeration value="ui8"/>
      <xs:enumeration value="r4"/>
      <xs:enumeration value="r8"/>
      <xs:enumeration value="r10"/>
<!-- szXMLFloat/szXMLNumber <xs:enumeration value="r8"/> -->
      <xs:enumeration value="fixed"/>
      <xs:enumeration value="fixedFMT"/>
      <xs:enumeration value="boolean"/>
      <xs:enumeration value="date"/>
      <xs:enumeration value="dateTime"/>
      <xs:enumeration value="time"/>
      <xs:enumeration value="array"/>
      <xs:enumeration value="struct"/>
      <xs:enumeration value="nested"/>
      <xs:enumeration value="string.uni"/>
      <xs:enumeration value="string"/>
      <xs:enumeration value="bin.hex"/>
      <xs:enumeration value="IntArray"/>
      <xs:enumeration value="UIntArray"/>
      <xs:enumeration value="SQLdateTime"/>
      <xs:enumeration value="SQLdateTimeOffset"/>
    </xs:restriction>
  </xs:simpleType>
  <!-- subtype -->
  <xs:simpleType name="subtype">
    <xs:restriction base="xs:Name">
      <xs:enumeration value="Text"/>
      <xs:enumeration value="Binary"/>
      <xs:enumeration value="Formatted"/>
      <xs:enumeration value="Ole"/>
      <xs:enumeration value="Graphics"/>
      <xs:enumeration value="dBASEOle"/>
      <xs:enumeration value="TypedBinary"/>
      <xs:enumeration value="Money"/>
      <xs:enumeration value="Autoinc"/>
      <xs:enumeration value="AccessOle"/>
      <xs:enumeration value="HMemo"/>
      <xs:enumeration value="HBinary"/>
      <xs:enumeration value="ADTNestedTable"/>
      <xs:enumeration value="FixedChar"/>
      <xs:enumeration value="Reference"/>
      <xs:enumeration value="BFile"/>
      <xs:enumeration value="ADTDate"/>
      <xs:enumeration value="Guid"/>
      <xs:enumeration value="WideText"/>
      <!-- Binary is required for fieldtype="bin.hex" -->
      <!-- FixedChar is required for fieldtype="string" when the field is CHAR (but not NCHAR) -->
      <!-- Guid is required for fieldtype="string" when the field is GUID -->
      <!-- Text is required for fieldtype="bin.hex" when the underlying field is TEXT or NTEXT (memo?) -->
      <!-- Money is required for fieldtype="float" when the underlying field is CURRENCY -->
    </xs:restriction>
  </xs:simpleType>
  <!-- PARAM/param -->
  <xs:element name="PARAM" type="param"/>
  <xs:complexType name="param">
    <xs:attribute name="Name" type="paramName" use="required"/>
    <!-- two forms of Value are possible; xs:Name is for ORIGIN; xs:postiveInteger is for PROVFLAGS (in combination with Type)
        <xs:attribute name="Value" type="xs:Name" use="required"/>
        <xs:attribute name="Value" type="xs:postiveInteger" use="required"/>
-->
    <xs:attribute name="Value" type="xs:string" use="required"/>
    <xs:attribute name="Type" type="FIELDTYPE" use="optional"/>
    <xs:attribute name="Roundtrip" type="xs:Name" use="required" fixed="True"/>
  </xs:complexType>
  <!-- paramName -->
  <xs:simpleType name="paramName">
    <xs:restriction base="xs:Name">
      <xs:enumeration value="ORIGIN"/>
      <xs:enumeration value="PROVFLAGS"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

С уважением.

Ну, я тоже не смог найти ни одного, поэтому я использовал этот сайт для генерации этой схемы на основе XML-файла ClientDataSet.

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="DATAPACKET">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="METADATA" />
        <xs:element ref="ROWDATA" />
      </xs:sequence>
      <xs:attribute name="Version" type="xs:NMTOKEN" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="FIELD">
    <xs:complexType>
      <xs:attribute name="fieldtype" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="WIDTH" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="attrname" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="required" type="xs:NMTOKEN" use="optional" />
    </xs:complexType>
  </xs:element>

  <xs:element name="FIELDS">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="FIELD" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="METADATA">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="FIELDS" />
        <xs:element ref="PARAMS" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="PARAMS">
    <xs:complexType>
      <xs:attribute name="CHANGE_LOG" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="ROW">
    <xs:complexType>
    </xs:complexType>
  </xs:element>

  <xs:element name="ROWDATA">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="ROW" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Я полностью новичок в Delphi, но мне пришлось иметь дело с анализом TClientDataSet в формате XML. Мне также нужен был список всех возможных значений для типа поля. Покопался в источнике Delphi и придумал этот список.

Если вы хотите включить типы полей в схему, вам следует включить все перечисленные здесь типы:

<xs:enumeration value="string" />
<xs:enumeration value="id" />
<xs:enumeration value="idref" />
<xs:enumeration value="idrefs" />
<xs:enumeration value="entity" />
<xs:enumeration value="entities" />
<xs:enumeration value="nmtoken" />
<xs:enumeration value="nmtokens" />
<xs:enumeration value="number" />
<xs:enumeration value="int" />
<xs:enumeration value="enumeration" />
<xs:enumeration value="notation" />
<xs:enumeration value="fixed" />
<xs:enumeration value="boolean" />
<xs:enumeration value="dateTime" />
<xs:enumeration value="dateTime.tz" />
<xs:enumeration value="date" />
<xs:enumeration value="time" />
<xs:enumeration value="time.tz" />
<xs:enumeration value="i1" />
<xs:enumeration value="byte" />
<xs:enumeration value="i2" />
<xs:enumeration value="i4" />
<xs:enumeration value="i8" />
<xs:enumeration value="ui1" />
<xs:enumeration value="ui2" />
<xs:enumeration value="ui4" />
<xs:enumeration value="ui8" />
<xs:enumeration value="r4" />
<xs:enumeration value="r8" />
<xs:enumeration value="float" />
<xs:enumeration value="char" />
<xs:enumeration value="uuid" />
<xs:enumeration value="bin.hex" />
<xs:enumeration value="bin.base64" />

Спасибо за хорошую работу по определению этой схемы. Это очень помогает.

Другие вопросы по тегам