2010-11-26 8 views
2

Ich habe einige C# -Klassen von einigen 3GPP XSDs (mehrere XSD-Dateien/Namespaces) generiert und es funktioniert hervorragend für die Serialisierung abgesehen von einem Problem mit konkreten Instanzen eines abstrakten Typs, der in einer Substitutionsgruppe verwendet wird.XML-Serialisierung von xsd.exe generierten Code mit Ersetzungsgruppen ist ungültig (ungültiger xsi: type error)

Zunächst werden die relevanten Teile des Schemas:

(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 

Die XML-Daten aus einem einfachen ManagedElement serialisiert mit enthalten ENBFunction ist:

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

Die eingebaute visuelle Studio-XML-Validierung beschwert sich über das Element mit der Aussage "Dies ist ein ungültiger xsi: type" http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm:ENBFunction ".

Also ist das serialisierte XML falsch oder die Validierung? Hat es etwas mit den separaten Namespaces zu tun?

Ich kann das XML einfach deserialisieren, aber ich brauche das generierte XML Schema-kompatibel (ohne die Schemas zu ändern). Ich fand, dass, wenn ich manuell die XML auf die folgenden ändern, wird der Fehler verschwindet (und ich finde es einfacher, auch zu lesen):

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

Kann ich zwingen, den Serializer Ausgabe, die es auf diese Weise?

Dank für das Schauen ...

+1

Viel Glück, dass der XML-Serializer mit etwas so Komplexem fertig wird. Sie können besser mit LINQ to XML "rollen" oder bestenfalls einige Ihrer problematischen Klassen "IXmlSerializable" implementieren und diese "von Hand" behandeln. " –

+0

Danke, ich überlege mir meine Optionen, aber unter Druck etwas schnell arbeiten zu lassen. Ich bin ein wenig verwirrt über den Fehler im Zusammenhang mit xsi: Typ um ehrlich zu sein - ist das XML mit dieser falsch generiert (es sieht für mich gültig)? – zeroid

Antwort

2

Ich löste dies manuell aus dem XSD generierte Code bearbeiten. Ein XmlElementAttribute auf der Sammlung Klassen Artikel ManagedElement benötigt, um die Serialisierung, um sicherzustellen, funktioniert einwandfrei:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.3gpp.org/ftp/specs/archive/32_series/32.625#genericNrm", IsNullable=false)] 
public partial class ManagedElement : NrmClass { 

... 

[System.Xml.Serialization.XmlElementAttribute("ENBFunction", typeof(ENBFunction), Namespace = "http://www.3gpp.org/ftp/specs/archive/32_series/32.765#eutranNrm")] 
public NrmClass[] Items { 
... 

Dieses Attribut ist erforderlich für alle Klassen von ManagedElement geerbt die richtigen, um sicherzustellen, wird bei der Serialisierung Zeit verwendet.

Verwandte Themen