Toute personne possédant un XSD partiel décrivant la section METADATA des fichiers XML Delphi TClientDataSet?

StackOverflow https://stackoverflow.com/questions/492198

Question

Je sais que vous ne pouvez pas décrire complètement le XML indiquant que le TClientDataSet avec un schéma XSD, car les éléments ROW ont des attributs dont les noms varient en fonction du contenu.

Cependant, la section METADATA d'un tel XML devrait être.

Donc: y a-t-il quelqu'un avec un XSD (partiel) décrivant la partie METADATA du XML pouvant être sauvegardé avec Delphi TClientDataSets?

Cordialement.

PS:

Merci pour les pointeurs vers XML - > outils / sites de conversion XSD; J'aurais dû écrire que je le faisais moi aussi, mais que générer ce XSD de manière appropriée (c'est-à-dire couvrant toutes les possibilités) nécessitera une entrée XML couvrant toutes les possibilités (comme les allers-retours, les lignes, etc.). Je vais essayer de trouver un XSD décent de cette façon et le poster ici.

Était-ce utile?

La solution 2

Modifier:
Divisez le fichier XSD en deux parties et complétez-le en utilisant ces fichiers dans Delphi XE: dsconst.h, dspickle.h, dsxml.h.
S'il vous plaît PM ou commenter si vous avez des ajouts.

Les fichiers XSD ci-dessous semblent fonctionner raisonnablement jusqu'à présent. Si vous avez un code XML TClientDataSet qui ne valide pas cela, veuillez m'envoyer votre code XML (Google ou mettez un commentaire ci-dessous pour mon adresse électronique).

D'abord le fichier CDS.xsd, qui inclut le fichier CDS_METADATA_FIELDS_include.xsd plus loin.
Il définit la structure de base d'un document XML TClientDataSet: DATAPACKET, contenant METADATA et ROWDATA, où FIELDS contient PARAMS et ROW, et <=> contient <=> éléments:

<?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>

Notez que <=> les éléments sont typés de manière très vague, car ils contiendront des noms d'attributs définis dynamiquement.

Ensuite, le fichier <=> qui contient les métadonnées sous-jacentes utilisées par les éléments <=> et <=>.
Il n’est pas encore complètement terminé car je n’ai pas trouvé de fichiers CDS XML contenant les mots-clés mentionnés dans les commentaires ci-dessous.

<?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>

Cordialement.

Autres conseils

Je ne pouvais pas en trouver non plus. J'ai donc utilisé ce site Web pour générer ce schéma. sur un fichier 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>

Je suis un novice total dans Delphi, mais je devais traiter l’analyse d’un TClientDataSet au format XML. J'avais également besoin d'une liste de toutes les valeurs possibles pour le type de champ. Certains ont fouillé dans les sources de Delphi et sont venus avec cette liste.

Si vous souhaitez inclure les types de champs dans le schéma, vous devez inclure tous les types énumérés ici:

<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" />

Merci d’avoir réussi à définir ce schéma. Cela aide beaucoup.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top