ไม่มีแท็กที่จำเป็นเมื่อใช้ Delphi XML Data Binding Wizard


99

ฉันใช้XML Data Binding WizardในDelphi XE2. สคีมาต้องใช้แท็กประเภทนี้:

<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-group จะไม่มี<Values>-tag และไฟล์ XML จะล้มเหลวในการตรวจสอบกับไฟล์XSD. นี่อาจจะไม่เป็นปัญหาหากอินเทอร์เฟซมีวิธีการ "เพิ่ม" Values-tag

มีวิธีการมาตรฐานในการจัดการสิ่งนี้หรือฉันใช้รหัสที่สร้างขึ้นอย่างถูกต้อง?

ใส่เพียงจะมีใด ๆวิธีการทำงานรอบหรือมิฉะนั้นใช้รหัสจากที่Data Binding Wizardในการผลิตต่อไปนี้XML(ซึ่งเป็นสิ่งที่จำเป็นในการตรวจสอบโดยใช้สคีมาข้างต้นเมื่อไม่มีโหนดลูก) ให้HeaderType, ValuesTypeและEventsTypeมี complexType :

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

(ฉันรู้ว่ามีปัญหาอื่น ๆ ที่คล้ายกันเช่นรหัสที่สร้างขึ้นโดย<xs:sequence>ไม่บังคับใช้คำสั่งที่ถูกต้องในXMLไฟล์สุดท้ายแต่อย่างน้อยสำหรับปัญหานั้นก็มีวิธีแก้ไขโดยเพียงแค่ใส่ลูกตามลำดับที่ถูกต้องฉันยังคิดว่า คงจะดีไม่น้อยหากEmbarcaderoมีอินเทอร์เฟซที่สมบูรณ์ซึ่งต้องคำนึงถึงคุณสมบัติเหล่านี้มากกว่า)


คุณได้ค้นพบต้นตอของปัญหาแล้วเมื่อกล่าวถึงการสั่งซื้อ คลาสที่สร้างขึ้นคือเครื่องห่อใบ้รอบ ๆ โมเดลอ็อบเจ็กต์ XML จะมีอยู่เมื่อถูกขอเท่านั้น ด้วยประเภทสตริงสิ่งนี้ทำได้ง่ายพอ (เพียงแค่เพิ่มสตริงว่าง) แต่สำหรับประเภทที่ซับซ้อนฉันไม่แน่ใจว่าจะไม่มีผลหรือไม่
Leonardo Herrera

นี่ไม่ใช่เรื่องจริงเลยทีเดียว รหัสสำหรับTXMLValuesType.AfterConstructionอ่านRegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;เพื่อให้มีคอลเล็กชันของ Value-items (ภายใต้แท็กค่าหลัก) ซึ่งเป็นสิ่งที่ทำให้ยากที่จะสร้าง Values-tag ที่ว่างเปล่า Value-list ที่ว่างเปล่าจะหยุดคุณจากการบังคับSaveToFileให้สร้าง<Values />-tag
Randomeister

3
@Randomeister - ลองใช้แอตทริบิวต์ minOccurs = "1" ใน XSD ของคุณ: <xs: all maxOccurs = "1"> ลองใช้ <xs: sequence> แทน <xs: all> ฉันได้ทำงานร่วมกับวิซาร์ดการผูก (ใน Delphi XE) เป็นอย่างดีและไม่พบปัญหาใด ๆ - แต่คุณต้องตรวจสอบให้แน่ใจว่าคุณประกาศประเภทและคุณสมบัติของคุณอย่างถูกต้องเพื่อให้วิซาร์ดเข้าใจลำดับและค่าบังคับ
เวกเตอร์

คำตอบ:


1

ไม่แน่ใจว่าจะเข้าใจ แต่สิ่งที่คุณกำลังมองหาคือ: 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>

บอกฉันว่ามันโอเค

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.