Обязательные теги отсутствуют при использовании мастера привязки данных XML Delphi

99

Я использую файл XML Data Binding Wizardin 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бы он предоставил полный интерфейс, учитывающий больше этих функций.)

Randomeister
источник
Вы уже обнаружили корень проблемы при упоминании заказа. Созданный класс представляет собой тупую оболочку объектной модели XML; он будет существовать только тогда, когда его попросят. Со строковыми типами это достаточно просто (просто добавьте пустую строку), но для сложных типов я не уверен, что nil будет работать.
Леонардо Эррера
На самом деле это не совсем так. Код для TXMLValuesType.AfterConstructionчтения, RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;поэтому существует коллекция элементов-значений (под родительским тегом Values), что затрудняет создание пустого тега Values. Пустой список значений фактически остановит вас от принуждения 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>

Скажи мне, нормально ли.

Ганс
источник