2008-11-18 7 views
1

J'ai une application Web .NET qui consomme un service Web basé sur Java. L'un des objets, nommé Optional, contient des champs de critères de recherche. Le schéma est le suivant:Problème de sérialisation XML pour minoccurs

<xsd:complexType name="Optional"> 
<xsd:sequence> 
    <xsd:element name="FromAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
    <xsd:element name="ToAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
    <xsd:element name="FromDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
    <xsd:element name="ToDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
    <xsd:element name="FromCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
    <xsd:element name="ToCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
</xsd:sequence> 
</xsd:complexType> 

Le problème que je suis en cours d'exécution en est que les éléments de l'enfant ne sérialisation même quand elles une valeur est attribuée dans l'application Web. Si je supprime l'attribut minOccurs, tout va bien.

Comment faire pour que ces éléments soient facultatifs, mais pour sérialiser lorsqu'une valeur leur est affectée?

Merci d'avance pour votre aide.

Répondre

3

dans .NET WS pour les types non nulle (en .NET) qui sont marqués en option dans le schéma ont une propriété spécifiée supplémentaire généré pour ceux qui contrôlent si l'élément apparaît. Très ennuyeux, le setter pour la valeur ne définit pas le drapeau spécifié supplémentaire, donc vous devez le faire.

x.ToAmmount = 24.0f; 
x.ToAmmountSpecified = true; 
// etc for the rest of the poperties 
+0

Où dois-je placer ces paramètres? Je reçois les propriétés renseignées dans mon objet dans le code, mais lors de la sérialisation d'un XML rempli cela ne fonctionnera pas, sur chaque champ qui a minOccurs. –

+0

Dans votre code, lorsque vous définissez la valeur de la propriété, définissez également l'indicateur spécifié correspondant sur true. – superfell

0

Ce schéma ne définit aucun type de document xml. Il fournit simplement une déclaration pour un type compex nommé "Facultatif", mais il n'y a aucune référence à ce type de n'importe où.

Le document xml en cours de définition doit avoir au moins un élément supérieur. cet élément supérieur doit être défini quelque part (dans une portée globale). Il n'y a pas de telle définition dans le schéma fourni.

Un exemple minimal d'un schéma XML, qui est similaire à celui fourni, mais ne définit un document XML est le suivant:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema 
    elementFormDefault="qualified" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
> 
    <xsd:element name="Optional" type="Optional"/> 
    <xsd:complexType name="Optional"> 
    <xsd:sequence> 
     <xsd:element name="FromAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
     <xsd:element name="ToAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
     <xsd:element name="FromDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
     <xsd:element name="ToDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
     <xsd:element name="FromCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
     <xsd:element name="ToCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema>

et le document XML simple qui peut être validé avec succès contre ce schéma est juste

        <Optional/>

(puisque tous les enfants de l'élément supérieur sont définis comme opt ional).

J'espère que cela a aidé.

vôtre,

Dimitre Novatchev

+0

Dimitre, Merci pour votre réponse. Je m'excuse de ne pas avoir clarifié que le xml affiché n'est qu'un extrait du WSDL. Le document est bien formé, mais je n'ai pas affiché le WSDL entier parce que je ne pensais pas que c'était pertinent au problème que je vis. – Mondo

+0

Mondo, merci d'avoir clarifié cela. Que diriez-vous de définir le problème encore mieux? Une définition correcte du problème est un prérequis nécessaire pour quiconque le comprend et peut aider. –

0

Ma compréhension est que nillable = « true » génère un xsi: nil = « true » dans le fichier XML de valeur si la valeur est présente, ce qui signifie que l'élément est toujours créé, même si la valeur est nulle . Essayez de supprimer l'attribut nillable et de conserver minOccurs = "0". Je n'ai pas essayé cependant.

Questions connexes