Deserialisation d'un flux XML avec plusieurs namespaces
sesques
Messages postés3Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention14 décembre 2003
-
13 déc. 2003 à 22:56
cs_vieuxLion
Messages postés455Date d'inscriptionsamedi 26 octobre 2002StatutMembreDernière intervention 6 avril 2004
-
16 déc. 2003 à 17:36
Bonjour,
Sans parler de Service Web car je n'utilise pas SOAP, je veux utiliser la classe XmlSerializer pour exploiter un flux XML entrant sur du HTTP. A l'origine, le message XML est défini dans 2 schémas distincts (une enveloppe et un message).
Dans le schéma enveloppe, le noeud réferençant l'autre schéma est défini par:
<xsd:complexType name="Message">
<xsd:choice minOccurs="0">
<xsd:element name="ERREUR" type="Erreur"/>
<xsd:any namespace="##other" processContents="strict"/>
</xsd:choice>
</xsd:complexType>
J'ai généré les fichiers classe correspondants avec xsd.exe, utilisant le même namespace C# -> toutes les classes (enveloppe et message sont visibles).
Mon problème est que lorsque je deserialise le flux, les classes du namespace enveloppe sont bien générées, masi pas celles du message : l'objet Item de la classe Message est de type XMlNode (avec le flux XML correspondant) au lieu d'être du type correspondant dans le schéma message.
Lorsque je fais 1 seul schéma avec les 2, tout fonctionne correctement (deserialisation et serialisation).
Le problème est donc de reférencer d'autres espaces de noms que celui du noeud root à la déserialisation (pour moi, ce n'est possible qu'à la serialization).
Quelqu'un a-t-il la solution ?
Merci d'avance.
Pascal
A voir également:
Deserialisation d'un flux XML avec plusieurs namespaces
sesques
Messages postés3Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention14 décembre 2003 14 déc. 2003 à 23:38
Bonjour,
Je l'ai trouvée moi-même. Pour les curieux, en fait, l'outil xsd.exe est assez limité pour des types complexes, et le serializer aussi. Pour que cela marche avec 2 schémas, je doit générer les fichier C# avec les schémas d'origine, puis éditer le fichier de l'enveloppe pour modifier la classe message comme suit:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="schema.enveloppe")]
public class Message
{
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("ERREUR", typeof(MessageErreur[]))]
[System.Xml.Serialization.XmlElementAttribute("MESSAGE_X", typeof(MESSAGE_X),Namespace="Schema.message")]
public object Item;
...
}
C'est à dire spécifier le type et le schéma additionnel dans le fichier de classes. Le serializer ne sait pas se débrouiller tout seul avec le flux XML qui spécifie ce schéma dans le noeud <MESSAGE_X xmlns="Schema.message">
Hum, hum, je crois que je vais me le réécrire moi-même le sérializer si ça continue... car ce n'est pas la seule limitation que je lui est trouvé...