J'ai généré des classes C# à partir de XSD 3GPP (plusieurs fichiers/espaces de noms XSD) et ça marche très bien pour la sérialisation problème avec les instances concrètes d'un type abstrait utilisé dans un groupe de substitution.XML Sérialisé à partir du code généré par xsd.exe en utilisant des groupes de substitution est invalide (erreur xsi: type invalide)
Tout d'abord, les parties pertinentes du schéma:
(genericNrm.xsd)
<element name="ManagedElement">
<complexType>
<complexContent>
<extension base="xn:NrmClass">
<sequence>
...
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="xn:IRPAgent"/>
<element ref="xn:ManagedElementOptionallyContainedNrmClass"/>
<element ref="xn:VsDataContainer"/>
</choice>
</sequence>
</extension>
</complexContent>
</complexType>
</element>
<element
name="ManagedElementOptionallyContainedNrmClass"
type="xn:NrmClass"
abstract="true"
/>
(eutran.xsd)
<element name="ENBFunction" substitutionGroup="xn:ManagedElementOptionallyContainedNrmClass">
<complexType>
<complexContent>
<extension base="xn:NrmClass">
<sequence>
<element name="attributes" minOccurs="0">
<complexType>
<all>
<element name="userLabel" type="string" minOccurs="0"/>
... etc
Le XML sérialisé d'un simple ManagedElement avec contenues ENBFonction est:
<ManagedElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="1234" xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm">
<ManagedElementOptionallyContainedNrmClass xmlns:q1="http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm" xsi:type="q1:ENBFunction" id="1234">
<q1:attributes>
<q1:userLabel>label</q1:userLabel>
</q1:attributes>
</ManagedElementOptionallyContainedNrmClass>
</ManagedElement>
La validation XML de Visual Studio intégrée se plaint de l'élément, indiquant "Ceci est un xsi non valide: type" http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm:ENBFunction ".
Le XML sérialisé est-il erroné ou la validation? Est-ce quelque chose à voir avec les espaces de noms séparés?
Je peux désérialiser le XML très bien, mais j'ai besoin que le XML généré soit compatible avec le schéma (sans changer les schémas). Je trouve que si je change manuellement le XML à ce qui suit, l'erreur disparaît (et je le trouve plus facile à lire aussi):
<ManagedElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="1234" xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm">
<q1:ENBFunction xmlns:q1="http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm" id="1234">
<q1:attributes>
<q1:userLabel>label</q1:userLabel>
</q1:attributes>
</q1:ENBFunction>
</ManagedElement>
Puis-je forcer le sérialiseur à la sortie de cette façon?
Merci pour la recherche ...
Bonne chance d'avoir le XML Serializer pour faire face à quelque chose de si complexe. Il vaudrait peut-être mieux «rouler le vôtre» en utilisant LINQ to XML, ou au mieux, avoir certaines de vos classes ennuyeuses implémenter 'IXmlSerializable', et les gérer« à la main ».' –
Merci, je considère mes options mais sous pression pour obtenir quelque chose qui fonctionne rapidement. Je suis un peu confus à propos de l'erreur liée à xsi: tapez pour être honnête - le code XML est-il généré incorrectement (cela me semble valable)? – zeroid