2012-10-01 12 views
82

Używam Kreatora powiązania danych XML w Delphi XE2. Schemat wymagał tagów tego typu:Wymagane znaczniki nie występują podczas korzystania z Kreatora powiązania danych XML Delphi

<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 polega na tym, że jeśli nie dodawać żadnych elementów do np w grupie Values ​​nie będzie żadnego testu, a plik XML nie przejdzie walidacji z XSD. Prawdopodobnie nie stanowiłoby to problemu, gdyby interfejs zapewniał metodę "dodawania" znacznika Values.

Czy istnieje standardowy sposób postępowania z tym problemem, czy też używam wygenerowanego kodu poprawnie?

Mówiąc prościej, jest tam dowolny sposób obejścia lub w inny sposób, przy użyciu kodu od danych Kreatora wiążące, aby produkować następujące XML (czyli to, co jest potrzebne, aby potwierdzić za pomocą powyższego schematu, gdy istnieje Brak węzły potomne), podane HeaderType, ValuesType i EventsType są complexType:

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

(wiem, że istnieją inne podobne kwestie, jak kod wygenerowany przez <xs:sequence> nie egzekwowanie prawidłowej kolejności w końcowej pliku XML, ale przynajmniej w tym przypadku można obejść, po prostu wstawiając dzieci we właściwej kolejności że byłoby miło, gdyby Embarcadero dostarczy kompletny interfejs, który zajmuje więcej z tych funkcji pod uwagę)

+0

Już znalazłeś źródło problemu po wspomnianym zamówieniu. Wygenerowana klasa jest głupim opakowaniem wokół modelu obiektów XML; będzie istnieć tylko wtedy, gdy zostanie o to poproszony. W przypadku typów łańcuchów jest to dość łatwe (wystarczy dodać pusty łańcuch), ale w przypadku typów złożonych nie jestem pewien, czy będzie działać zero. –

+0

To nie jest do końca prawdą. Kod dla 'TXMLValuesType.AfterConstruction' brzmi: ' RegisterChildNode ('Wartość', TXMLValueType); FValue: = CreateCollection (TXMLValueTypeList, IXMLValueType, 'Value') jako IXMLValueTypeList; ' , tak więc istnieje zbiór elementów Value (pod nadrzędnym znacznikiem Values), co sprawia, że ​​tak trudno jest utworzyć pusty Values-tag . Pusta lista wartości skutecznie powstrzyma cię przed wymuszeniem "SaveToFile" na wygenerowaniu '@' -tag – Randomeister

+1

@Randomeister - Wypróbuj atrybut minOccurs = "1" w twoim XSD: \t . Spróbuj również użyć zamiast . Bardzo dobrze współpracowałem z kreatorem powiązania (w Delphi XE) i nie napotkałem żadnych problemów - ale musisz upewnić się, że deklarujesz typy i atrybuty poprawnie, aby kreator zrozumiał kolejność i obowiązkowe wartości. – Vector

Odpowiedz

1

Nie jestem pewien do zrozumienia, ale być może to, czego szukasz jest:. używać = „opcjonalne”

<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, czy to w porządku.

+0

w górę. Czy tego właśnie szukałeś? – Hans