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

82

Я использую мастер привязки данных XML в 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> -tag, и XML файл не будет проверять проверку XSD. Вероятно, это не было бы проблемой, если бы интерфейс предоставлял метод "добавления" тега Values.

Есть ли стандартный способ обработки этого, или я использую сгенерированный код правильно?

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

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

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

  • 0
    Вы уже обнаружили корень проблемы при упоминании заказа. Сгенерированный класс является глупой оболочкой для объектной модели XML; оно будет существовать только тогда, когда его попросят. С строковыми типами это достаточно просто (просто добавьте пустую строку), но для сложных типов я не уверен, будет ли работать nil.
  • 0
    На самом деле это не совсем так. Код для TXMLValuesType.AfterConstruction читает RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList; таким образом, существует коллекция элементов Value (под родительским тегом Values), из-за чего так сложно создать пустой тег Values. Пустой список значений фактически не даст вам заставить SaveToFile создать <Values />
Показать ещё 1 комментарий
Теги:
xsd
delphi-xe2

1 ответ

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>

Скажи мне, хорошо ли это.

  • 0
    вверх. Это то, что вы искали?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню