Các thẻ bắt buộc không xuất hiện khi sử dụng Trình hướng dẫn liên kết dữ liệu XML của Delphi


99

Tôi đang sử dụng XML Data Binding Wizardtrong Delphi XE2. Lược đồ có các thẻ bắt buộc thuộc loại này:

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

Vấn đề là nếu tôi không thêm bất kỳ phần tử nào vào ví dụ Values-group, thì sẽ không có <Values>-tag và tệp XML sẽ không xác thực được đối với XSD. Điều này có lẽ sẽ không thành vấn đề nếu giao diện cung cấp một phương pháp để "thêm" thẻ Values-tag.

Có cách tiêu chuẩn nào để xử lý vấn đề này không hay tôi đang sử dụng đúng mã đã tạo?

Một cách đơn giản , là có bất kỳ cách nào, công việc xung quanh hoặc cách khác, sử dụng mã từ Data Binding Wizard, để sản xuất như sau XML(đó là những gì cần thiết để xác nhận sử dụng sơ đồ trên khi không có nút con), được đưa ra HeaderType, ValuesTypeEventsTypelà của complexType :

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

(Tôi biết có những vấn đề tương tự khác, chẳng hạn như mã được tạo ra bằng cách <xs:sequence>không thực thi thứ tự chính xác trong XML-tệp cuối cùng , nhưng ít nhất đối với vấn đề đó, có một cách giải quyết bằng cách chỉ cần chèn các con theo đúng thứ tự. Tôi vẫn nghĩ sẽ rất tuyệt nếu Embarcaderocung cấp một giao diện hoàn chỉnh, có tính đến nhiều tính năng hơn.)


Bạn đã phát hiện ra gốc rễ của vấn đề khi đề cập đến việc đặt hàng. Lớp được tạo là một lớp bao bọc ngu ngốc xung quanh mô hình đối tượng XML; nó sẽ chỉ tồn tại khi được yêu cầu. Với các loại chuỗi, điều này đủ dễ dàng (chỉ cần thêm một chuỗi rỗng) nhưng đối với các loại phức tạp, tôi không chắc liệu nil có hoạt động hay không.
Leonardo Herrera

Điều này thực sự không hoàn toàn đúng. Mã để TXMLValuesType.AfterConstructionđọc RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;để tồn tại bộ sưu tập Mục giá trị (dưới thẻ Giá trị gốc), đó là điều khiến việc tạo thẻ Giá trị trống rất khó. Danh sách giá trị trống sẽ ngăn bạn SaveToFiletạo thẻ <Values />-tag một cách hiệu quả
Randomeister

3
@Randomeister - Thử thuộc tính minOccurs = "1" trong XSD của bạn: <xs: all maxOccurs = "1">. Ngoài ra, hãy thử sử dụng <xs: sequence> thay vì <xs: all>. Tôi đã làm việc tốt với trình hướng dẫn liên kết (trong Delphi XE) và không gặp phải bất kỳ sự cố nào - nhưng bạn phải đảm bảo rằng bạn khai báo các loại và thuộc tính của mình một cách chính xác để trình hướng dẫn hiểu thứ tự và các giá trị bắt buộc.
Vector

Câu trả lời:


1

Không chắc để hiểu nhưng có thể những gì bạn đang tìm kiếm là: use = "option"

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

Nói cho tôi biết nếu nó ổn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.