Delphi XML Veri Bağlama Sihirbazı kullanılırken gerekli etiketler mevcut değil


99

Ben kullanıyorum XML Data Binding Wizardin Delphi XE2. Şema, bu türden gerekli etiketlere sahiptir:

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

Sorun şu ki, örneğin Values-grubuna herhangi bir eleman eklemezsem, -tag olmayacak <Values>ve XML dosyası XSD. Arayüz Values-tag'i "eklemek" için bir yöntem sağlıyorsa, bu muhtemelen bir problem olmazdı .

Bunu halletmenin standart bir yolu var mı, yoksa üretilen kodu doğru mu kullanıyorum?

Basitçe , orada herhangi kodunu kullanarak, iş çevresinde veya başka yolu Data Binding Wizardtakip üretmek için, XMLverilen (hiçbir çocuk düğümleri varken yukarıdaki şema kullanarak doğrulamak için ihtiyaç duyulan şey budur) HeaderType, ValuesTypeve EventsTypecomplexType vardır :

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

( <xs:sequence>Son XMLdosyada doğru sırayı zorlamadan oluşturulan kod gibi başka benzer sorunlar da olduğunu biliyorum , ancak en azından bunun için çocukları doğru sıraya yerleştirerek bir çözüm var. Hala düşünüyorum. EmbarcaderoBu özelliklerin daha fazlasını hesaba katan eksiksiz bir arayüz sunması güzel olurdu.)


Sipariş vermekten bahsedildiğinde sorunun kökenini zaten keşfettiniz. Oluşturulan sınıf, XML nesne modelinin etrafındaki aptal bir sarmalayıcıdır; sadece istendiğinde var olacaktır. Dize türlerinde bu yeterince kolaydır (sadece boş bir dizge ekleyin) ancak karmaşık türler için nil'in çalışıp çalışmayacağından emin değilim.
Leonardo Herrera

Bu aslında tam olarak doğru değil. Kodunu TXMLValuesType.AfterConstructionokur RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;(ana Değerler-etiketi altında) Değer-kalemlerin toplanması bu kadar zor boş Değerler-etiketi oluşturmak için kılan olan var bu yüzden. Boş değer listesi etkin bir zorlama durduramaz SaveToFileüretmek için <Values />Etiketleme-
Randomeister

3
@Randomeister - XSD'nizdeki minOccurs = "1" özniteliğini deneyin: <xs: all maxOccurs = "1">. Ayrıca <xs: all> yerine <xs: sequence> kullanmayı deneyin. Bağlama sihirbazıyla (Delphi XE'de) iyi bir anlaşma yaptım ve herhangi bir sorunla karşılaşmadım - ancak sihirbazın sırayı ve zorunlu değerleri anlaması için türlerinizi ve özniteliklerinizi doğru şekilde bildirdiğinizden emin olmalısınız.
Vektör

Yanıtlar:


1

Anladığınızdan emin değilim ama belki de aradığınız şudur: use = "isteğe bağlı"

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

Sorun olup olmadığını söyle bana.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.