2012-10-01 20 views
82

我在Delphi XE2中使用XML數據綁定向導。 架構已經不需要這種類型的標籤:使用Delphi XML數據綁定向導時不存在所需標記

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

的問題是,如果我不添加任何例如元素值 - 組,將不會有<Values>-tag,並且XML文件將無法通過XSD進行驗證。如果界面提供了一種「添加」Values-tag的方法,這可能不會成爲問題。

是否存在處理此問題的標準方法,或者我是否正確使用生成的代碼?

簡而言之,有任何方式,變通或以其它方式使用從數據綁定向導的代碼,產生以下XML(這是需要什麼時,有使用上述架構驗證給出HeaderType沒有子節點),ValuesType和EventsType是複雜類型的:

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

(我知道還有其他類似的問題,就像<xs:sequence>在最終的XML文件沒有強制執行正確的順序生成的代碼,但至少對於那個人來說,通過簡單地將孩子插入正確的順序就可以解決問題認爲這將是很好,如果Embarcadero公司將提供完整的接口,這需要更多的這些特徵考慮在內)

+0

在提到排序時,您已經發現問題的根源。生成的類是XML對象模型的愚蠢包裝器;它只會在被要求時才存在。對於字符串類型,這很容易(只需添加一個空字符串),但對於複雜類型,我不確定是否可以工作。 –

+0

這其實並不完全正確。 「TXMLValuesType.AfterConstruction」的代碼爲 RegisterChildNode('Value',TXMLValueType); FValue:= CreateCollection(TXMLValueTypeList,IXMLValueType,'Value')as IXMLValueTypeList;' 所以存在Value-items集合(在父值之下),這就是爲什麼很難創建空的Values-tag 。空值列表將有效地阻止您強制'SaveToFile'生成''-tag – Randomeister

+1

@Randomeister - 在您的XSD中嘗試minOccurs =「1」屬性:\t 。此外,請嘗試使用而不是。我已經在綁定向導(Delphi XE)中做了很多工作,並且沒有遇到任何問題 - 但是您必須確保正確地聲明您的類型和屬性,以便嚮導理解順序和強制值。 – Vector

回答

1

不知道理解,但也許你正在尋找的是:使用=「可選」

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

告訴我,如果沒關係。

+0

了。你在找什麼? – Hans

相關問題