2012-10-01 22 views
82

Estoy usando el Asistente de enlace de datos XML en Delphi XE2. El esquema ha requerido etiquetas de este tipo:Las etiquetas requeridas no están presentes cuando se usa Delphi XML Data Binding Wizard

<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 añado ningún elemento a, por ejemplo, el grupo de valores, no habrá <Values> -tag, y el archivo XML no aprobará la validación contra el XSD. Esto probablemente no sería un problema si la interfaz proporcionara un método para "agregar" la etiqueta de valores.

¿Hay una forma estándar de manejar esto, o estoy usando correctamente el código generado?

En pocas palabras, ¿hay cualquier manera, solución alternativa o de otro modo, utilizando el código partir de los datos Asistente de unión, para producir el siguiente código XML (que es lo que se necesita para validar mediante el esquema anterior cuando hay hay nodos secundarios), teniendo en cuenta HeaderType, ValuesType y EventsType son de tipoCompuesto:

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

(sé que hay otros problemas similares, al igual que el código generado por <xs:sequence> no hacer cumplir el orden correcto en el archivo XML final, pero al menos para eso, hay una solución temporal simplemente insertando a los niños en el orden correcto. Todavía creo que sería bueno si Embarcadero proporcionaría una interfaz completa, que tiene más de estas características en cuenta)

+0

Ya ha descubierto la raíz del problema cuando se menciona el pedido. La clase generada es un envoltorio tonto en torno al modelo de objetos XML; solo existirá cuando se le solicite. Con los tipos de cadena esto es bastante fácil (solo agrega una cadena vacía) pero para los tipos complejos no estoy seguro de si nada va a funcionar. –

+0

Esto no es del todo cierto. El código para 'TXMLValuesType.AfterConstruction' lee ' RegisterChildNode ('Value', TXMLValueType); FValue: = CreateCollection (TXMLValueTypeList, IXMLValueType, 'Value') como IXMLValueTypeList; ' por lo que existe la colección de elementos de valor (bajo la etiqueta de valores primaria), que es lo que hace que sea tan difícil crear la etiqueta de valores vacía . La lista de valores vacía le impedirá forzar 'SaveToFile' para producir' '-tag – Randomeister

+1

@Randomeister - Pruebe el atributo minOccurs =" 1 "en su XSD: \t . Además, intente usar en lugar de . He trabajado mucho con el asistente de encuadernación (en Delphi XE) y no he encontrado ningún problema, pero debe asegurarse de declarar correctamente sus tipos y atributos para que el asistente comprenda el orden y los valores obligatorios. – Vector

Respuesta

1
No

seguro de entender, pero tal vez lo que busca es:. use = "opcional"

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

+0

arriba. ¿Es lo que estabas buscando? – Hans

Cuestiones relacionadas