2012-10-01 25 views
82

Tôi đang sử dụng Trình hướng dẫn ràng buộc dữ liệu XML trong Delphi XE2. Giản đồ có các thẻ bắt buộc thuộc loại này:Thẻ bắt buộc không có mặt khi sử dụng Trình hướng dẫn ràng buộc dữ liệu 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> 

Vấn đề là nếu tôi không thêm bất kỳ thành phần nào, ví dụ: nhóm giá trị, 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ó thể sẽ không là vấn đề nếu giao diện đã cung cấp một phương thức để "thêm" thẻ giá trị.

Có cách nào tiêu chuẩn để xử lý việc này hay tôi đang sử dụng mã được tạo chính xác không?

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, bằng cách sử dụng mã từ Data Binding Wizard, để tạo ra XML sau (đó là những gì cần thiết để xác nhận sử dụng sơ đồ trên khi có không có nút con), được đưa ra HeaderType, ValuesType và EventsType là của complexType:

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

(tôi biết có những vấn đề tương tự khác, như các mã được tạo bởi <xs:sequence> không thực thi theo đúng thứ tự trong trận chung kết XML-file, nhưng ít nhất là cho một, có một công việc xung quanh bằng cách đơn giản chèn các em theo đúng thứ tự. nghĩ rằng nó sẽ được tốt đẹp nếu Embarcadero sẽ cung cấp một giao diện hoàn toàn, trong đó có nhiều tính năng vào tài khoản)

+0

Bạn đã khám phá ra gốc của vấn đề khi được đề cập đến. Lớp được tạo ra là một trình bao bọc câm 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 kiểu chuỗi, điều này là đủ dễ dàng (chỉ cần thêm một chuỗi rỗng) nhưng đối với các kiểu phức tạp, tôi không chắc chắn nếu nil sẽ hoạt động. –

+0

Điều này thực sự không hoàn toàn đúng. Mã cho 'TXMLValuesType.AfterConstruction' đọc ' RegisterChildNode ('Value', TXMLValueType); FValue: = CreateCollection (TXMLValueTypeList, IXMLValueType, 'Value') dưới dạng IXMLValueTypeList; ' do đó việc thu thập các Giá trị-mục (trong thẻ giá trị gốc) tồn tại, đó là những gì gây khó khăn cho việc tạo thẻ giá trị trống . Danh sách giá trị trống sẽ ngăn bạn khỏi buộc 'SaveToFile' để tạo ra' '-tag – Randomeister

+1

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

Trả lời

1

Không chắc để hiểu nhưng có lẽ những gì bạn đang tìm kiếm là:. sử dụng = "tùy chọn"

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

Cho tôi biết nếu không sao.

+0

lên. Đó là những gì bạn đang tìm kiếm? – Hans

Các vấn đề liên quan