Wymagane znaczniki nie występują podczas korzystania z Kreatora wiązania danych XML Delphi

99

Używam XML Data Binding Wizardin Delphi XE2. Schemat wymaga tagów tego typu:

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

Problem w tym, że jeśli nie dodam żadnych elementów np. Do Values-group, to nie będzie <Values>-tag, a plik XML nie przejdzie walidacji względem XSD. Prawdopodobnie nie stanowiłoby to problemu, gdyby interfejs udostępniał metodę „dodawania” Values-tagu.

Czy istnieje standardowy sposób radzenia sobie z tym, czy też używam wygenerowanego kodu nieprawidłowo?

Mówiąc prościej , jest tam jakikolwiek sposób obejścia lub w inny sposób, wykorzystując kod z Data Binding Wizard, aby produkować następujące XML(czyli to, co jest potrzebne, aby potwierdzić za pomocą powyższego schematu, gdy nie ma węzły potomne), biorąc pod uwagę HeaderType, ValuesTypea EventsTypesą complexType :

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

(Wiem, że istnieją inne podobne problemy, takie jak kod generowany przez <xs:sequence>nie wymuszanie właściwej kolejności w końcowym XMLpliku, ale przynajmniej w tym przypadku można obejść ten problem, po prostu wstawiając dzieci we właściwej kolejności. Nadal uważam, że byłoby miło, gdyby Embarcaderoudostępniono kompletny interfejs, który uwzględnia więcej tych funkcji).

Randomeister
źródło
Już odkryłeś źródło problemu, gdy wspomniałeś o zamawianiu. Wygenerowana klasa jest głupim opakowaniem wokół obiektu XML; będzie istnieć tylko wtedy, gdy zostaniesz o to poproszony. W przypadku typów łańcuchowych jest to dość łatwe (wystarczy dodać pusty ciąg), ale w przypadku typów złożonych nie jestem pewien, czy zero zadziała.
Leonardo Herrera
W rzeczywistości nie jest to do końca prawdą. Kod do TXMLValuesType.AfterConstructionodczytu, RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;więc istnieje kolekcja elementów Value (pod nadrzędnym tagiem Values), co sprawia, że ​​tak trudno jest utworzyć pusty tag Values. Pusta lista wartości skutecznie powstrzyma cię przed zmuszaniem SaveToFiledo tworzenia <Values />-tagu
Randomeister
3
@Randomeister - Wypróbuj atrybut minOccurs = "1" w swoim XSD: <xs: all maxOccurs = "1">. Spróbuj także użyć <xs: sequence> zamiast <xs: all>. Pracowałem dobrze z kreatorem wiązania (w Delphi XE) i nie napotkałem żadnych problemów - ale musisz upewnić się, że poprawnie deklarujesz swoje typy i atrybuty, aby kreator rozumiał kolejność i obowiązkowe wartości.
Vector,

Odpowiedzi:

1

Nie jestem pewien, czy rozumiesz, ale może to, czego szukasz, to: 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>

Powiedz mi, czy wszystko w porządku.

Hans
źródło