代码之家  ›  专栏  ›  技术社区  ›  Jeroen Wiert Pluimers

是否有人拥有描述Delphi TClientDataSet XML文件元数据部分的部分XSD?

  •  9
  • Jeroen Wiert Pluimers  · 技术社区  · 16 年前

    我知道您不能用XSD模式完全描述TClientDataSet中包含的XML,因为行元素的属性的名称随内容而变化。

    但是,这种XML的元数据部分应该是。

    当做

    附言:

    感谢您提供指向XML的指针->XSD转换工具/站点;我本来也应该这样写的,但是以适当的方式生成XSD(即覆盖所有可能性的方式)将需要覆盖所有可能性(如往返、rowstate等)的输入XML。 我将尝试以这种方式提出一个像样的XSD,并将其发布在这里。

    3 回复  |  直到 13 年前
        1
  •  8
  •   J__    16 年前

    我也找不到,所以我用了 this website

    <?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>
    
        2
  •  5
  •   menjaraz    13 年前

    编辑:
    将XSD分为两部分,并通过在中使用这些文件使其更加完整 Delphi XE dsconst.h , dspickle.h , dsxml.h

    到目前为止,下面的XSD文件似乎工作正常;如果您的TClientDataSet XML未通过此验证,请通过电子邮件向我发送您的XML(Google me或在下面对我的邮件地址发表评论)。

    首先是文件 CDS.xsd ,其中包括该文件 CDS_METADATA_FIELDS_include.xsd 进一步说。
    它定义了TClientDataSet XML文档的基本结构: DATAPACKET ,包含 METADATA ROWDATA 元数据 FIELDS PARAMS 行数据 包含 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>
    

    注意 元素的类型非常松散,因为它们将包含动态定义的属性名称。

    然后是文件 CD_元数据_字段_include.xsd 其中包含 PARAMS 元素。

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

        3
  •  2
  •   menjaraz    13 年前

    我是Delphi的新手,但必须处理XML格式的TClientDataSet解析。我还需要一个字段类型的所有可能值的列表。对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" />
    

    感谢您在定义此模式方面做得很好。这很有帮助。