Qualquer um que tenha um XSD parcial que descreve a seção de metadados de arquivos XML Delphi TClientDataset?

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

Pergunta

Eu sei que você não pode descrever completamente o XML que o TClientDataSet com um esquema XSD, como os elementos de linha têm atributos que têm nomes que variam de acordo com o conteúdo.

No entanto, a seção de metadados de tal XML deve ser.

Assim: há alguém ter um XSD (parcial) que descreve a parte de metadados XML que podem ser salvas com Delphi TClientDataSets

?

Cumprimentos.

PS:

Obrigado por os ponteiros para em XML> ferramentas de conversão XSD / sites; Eu deveria ter escrito que eu fiz que eu mesmo também, mas que a geração que XSD em um bom caminho (ou seja, aquele que cobre todas as possibilidades) terá XML de entrada que cobrir todas as possibilidades (como ida e volta, RowState, etc). Vou tentar chegar a um XSD decente que maneira e postá-lo aqui.

Foi útil?

Solução 2

Editar:
Dividir o XSD em duas partes, e tornou mais completa usando esses arquivos em Delphi XE:. dsconst.h, dspickle.h, dsxml.h
Por favor, PM ou comentário, se você tem adições.

Os arquivos XSD abaixo parece funcionar razoavelmente até agora; se você tiver XML TClientDataSet que não está validando com isso, por favor me escreva seu XML (Google me ou colocar um comentário abaixo para o meu endereço de e-mail).

Primeiro, o CDS.xsd arquivo, que inclui o CDS_METADATA_FIELDS_include.xsd arquivo mais adiante.
Ela define a estrutura básica de um documento XML TClientDataSet: DATAPACKET, contendo METADATA e ROWDATA, onde METADATA contém FIELDS e PARAMS, e ROWDATA contém elementos 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>

Note que os elementos ROW são muito vagamente digitado, como eles vão conter nomes de atributos que são definidos de forma dinâmica.

Em seguida, a CDS_METADATA_FIELDS_include.xsd arquivo que contém os dados de meta subjacentes utilizadas pelos elementos FIELDS e PARAMS.
Ele ainda não está totalmente completa, como eu não encontrei arquivos CDS XML contendo as palavras-chave mencionadas nos comentários abaixo.

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

Cumprimentos.

Outras dicas

Bem, eu não poderia encontrar um quer, então eu usei este site para gerar esse esquema baseado em um arquivo 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>

Eu sou um novato total em Delphi, mas teve de lidar com a análise de um TClientDataSet em formato XML. Eu também precisava de uma lista de todos os valores possíveis para o tipo de campo. Fiz alguma escavação na fonte de Delphi e veio com esta lista.

Se você quiser incluir os tipos de campo no esquema, em seguida, você deve incluir todos os tipos listados aqui:

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

Obrigado por uma fazendo um bom trabalho de definição deste esquema. Isso ajuda muito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top