Обов’язкові теги відсутні під час використання майстра прив'язки даних Delphi XML


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тегу.

Чи є стандартний спосіб поводження з цим, чи я правильно використовую згенерований код?

Простіше кажучи , чи є якийсь - небудь спосіб, обхідна або іншим чином , використовуючи код з Data Binding Wizard, щоб зробити наступне XML(що необхідно для перевірки з використанням вищевказаної схеми , коли немає ніяких дочірніх вузлів), з огляду на HeaderType, ValuesTypeі EventsTypeмають ComplexType :

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

(Я знаю, що є й інші подібні проблеми, як-от код, сформований <xs:sequence>не наведенням правильного порядку у фінальному XMLфайлі, але, принаймні, для цього, існує обробка, просто вставивши дітей у правильний порядок. Я все ще думаю було б непогано, якби ви Embarcaderoзабезпечили повний інтерфейс, який враховує більше цих функцій.)


Ви вже виявили корінь проблеми, коли згадували про замовлення. Згенерований клас - це німа обгортка навколо об'єктної моделі XML; воно буде лише тоді, коли його попросять. З типом рядків це досить просто (просто додайте порожній рядок), але для складних типів я не впевнений, чи буде нульовий.
Леонардо Еррера

Це насправді не зовсім так. Код для TXMLValuesType.AfterConstructionчитання, RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;таким чином, існує колекція елементів-цінностей (під батьківським тегом Values), через що так важко створювати порожній Values-тег. Порожній список цінностей фактично не дозволить вам змусити SaveToFileвиробляти <Values />тег
Randomeister

3
@Randomeister - Спробуйте атрибут minOccurs = "1" у вашому XSD: <xs: all maxOccurs = "1">. Також спробуйте використовувати <xs: послідовність> замість <xs: all>. Я добре працював із майстром прив'язки (у Delphi XE) і не стикався з жодними проблемами - але ви повинні переконатися, що ви правильно оголошуєте свої типи та атрибути, щоб майстер розумів порядок та обов'язкові значення.
Вектор

Відповіді:


1

Не впевнений, що розумієш, але, можливо, те, що ти шукаєш: use = "необов'язково"

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

Скажи мені, якщо це нормально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.