Las etiquetas necesarias no están presentes cuando se utiliza el Asistente de enlace de datos XML de Delphi

99

Estoy usando el XML Data Binding Wizardin Delphi XE2. El esquema tiene etiquetas requeridas de este tipo:

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

El problema es que si no agrego ningún elemento, por ejemplo, al Values-grupo, no habrá <Values>-etiqueta y el archivo XML fallará la validación contra el XSD. Esto probablemente no sería un problema si la interfaz proporcionara un método para "agregar" la Valuesetiqueta -et.

¿Existe una forma estándar de manejar esto o estoy usando el código generado incorrectamente?

En pocas palabras , ¿hay alguna forma, alternativa o de otra manera, usando el código de Data Binding Wizard, para producir lo siguiente XML(que es lo que se necesita para validar usando el esquema anterior cuando no hay nodos secundarios), dado HeaderType, ValuesTypey EventsTypeson de complexType :

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

(Sé que hay otros problemas similares, como el código generado al <xs:sequence>no imponer el orden correcto en el XMLarchivo final , pero al menos para ese, hay una solución simplemente insertando los niños en el orden correcto. Sigo pensando Sería bueno si Embarcaderoproporcionara una interfaz completa, que tenga en cuenta más de estas características).

Randomeister
fuente
Ya descubrió la raíz del problema cuando mencionó el pedido. La clase generada es una envoltura tonta del modelo de objetos XML; sólo existirá cuando se le pida. Con los tipos de cadena, esto es bastante fácil (solo agregue una cadena vacía) pero para los tipos complejos no estoy seguro de si nil funcionará.
Leonardo Herrera
En realidad, esto no es del todo cierto. El código para TXMLValuesType.AfterConstructionlee RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;para que exista la colección de elementos de valor (bajo la etiqueta de valores principal), que es lo que hace que sea tan difícil crear la etiqueta de valores vacía. La lista de valores vacía evitará que se obligue SaveToFilea producir la <Values />etiqueta
Randomeister
3
@Randomeister: prueba el atributo minOccurs = "1" en tu XSD: <xs: all maxOccurs = "1">. Además, intente usar <xs: sequence> en lugar de <xs: all>. He trabajado bastante con el asistente de enlace (en Delphi XE) y no he encontrado ningún problema, pero debe asegurarse de declarar sus tipos y atributos correctamente para que el asistente comprenda el orden y los valores obligatorios.
Vector

Respuestas:

1

No estoy seguro de entender, pero quizás lo que está buscando es: 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>

Dime si está bien.

Hans
fuente