Tag yang diperlukan tidak ada saat menggunakan Delphi XML Data Binding Wizard

99

Saya menggunakan XML Data Binding Wizarddalam Delphi XE2. Skema memerlukan tag jenis ini:

<xs:element name="MyReport" type="MyReportType" />
<xs:complexType name="MyReportType">
  <xs:all>
    <xs:element name="Header" type="HeaderType" />
    <xs:element name="Values" type="ValuesType" />
    <xs:element name="Events" type="EventsType" />
  </xs:all>
</xs:complexType>

Masalahnya adalah jika saya tidak menambahkan elemen apa pun ke misalnya Values-group, tidak akan ada <Values>-tag, dan file XML akan gagal validasi terhadap XSD. Ini mungkin tidak akan menjadi masalah jika antarmuka menyediakan metode untuk "menambahkan" Values-tag.

Apakah ada cara standar untuk menangani ini, atau apakah saya menggunakan kode yang dibuat dengan benar?

Sederhananya , apakah ada setiap cara, kerja-sekitar atau sebaliknya, menggunakan kode dari Data Binding Wizard, untuk menghasilkan berikut XML(yang adalah apa yang dibutuhkan untuk memvalidasi menggunakan skema di atas ketika tidak ada node anak), diberikan HeaderType, ValuesTypedan EventsTypeyang dari complexType :

<MyReport>
  <Header />
  <Values />
  <Events />
</MyReport> 

(Saya tahu ada masalah serupa lainnya, seperti kode yang dihasilkan dengan <xs:sequence>tidak memberlakukan urutan yang benar di akhir XML-file, tapi setidaknya untuk yang satu itu, ada penyelesaian dengan hanya memasukkan anak-anak dalam urutan yang benar. Saya masih berpikir alangkah baiknya jika Embarcaderomenyediakan antarmuka lengkap, yang mempertimbangkan lebih banyak fitur ini.)

Randomeister
sumber
Anda telah menemukan akar masalah saat menyebutkan pemesanan. Kelas yang dihasilkan adalah pembungkus bodoh di sekitar model objek XML; itu hanya akan ada jika diminta. Dengan tipe string ini cukup mudah (cukup tambahkan string kosong) tetapi untuk tipe kompleks saya tidak yakin apakah nil akan berfungsi.
Leonardo Herrera
Ini sebenarnya tidak sepenuhnya benar. Kode untuk TXMLValuesType.AfterConstructionmembaca RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;sehingga koleksi Value-items (di bawah tag induk Values) ada, yang membuat sangat sulit untuk membuat tag Values ​​yang kosong. Daftar-Nilai yang kosong akan secara efektif menghentikan Anda untuk memaksa SaveToFilememproduksi <Values />-tag
Randomeister
3
@Randomeister - Coba atribut minOccurs = "1" di XSD Anda: <xs: all maxOccurs = "1">. Selain itu, coba gunakan <xs: sequence> daripada <xs: all>. Saya telah bekerja dengan baik dengan wizard pengikat (di Delphi XE) dan tidak mengalami masalah apa pun - tetapi Anda harus memastikan bahwa Anda menyatakan tipe dan atribut dengan benar sehingga wizard memahami urutan dan nilai wajib.
Vektor

Jawaban:

1

Tidak yakin untuk mengerti tapi mungkin yang Anda cari adalah: use = "optional"

<xs:element name="MyReport" type="MyReportType" />
<xs:complexType name="MyReportType">
  <xs:all>
    <xs:element name="Header" type="HeaderType" use="optional" />
    <xs:element name="Values" type="ValuesType" use="optional" />
    <xs:element name="Events" type="EventsType" use="optional" />
  </xs:all>
</xs:complexType>

Beritahu saya jika tidak apa-apa.

Hans
sumber