2012-04-11 1 views
2

Ich muss einen komplexen Typ verwenden, der in einer anderen Assembly in meinem xsd-Schema definiert ist. Beide meiner .xsd Schemas sind als eingebettete Ressourcen definiert, und ich habe versucht, das Blatt, das ich in der Assembly importieren muss, zu verknüpfen, die es ohne Ergebnisse benötigt.In einen xsd-Schemakomplextyp einschließen, der in einer anderen Assembly definiert ist

Grundsätzlich, wenn ich eine meiner XML-Seiten validieren muss, rufe ich diese Funktion auf, aber es ist nicht in der Lage, die XML-Schemasätze der Typen innerhalb von Operationen in Kaskade hinzuzufügen.

public static XmlSchema GetDocumentSchema(this Document doc) 
{ 
    var actualType = doc.GetType(); 
    var stream = actualType.Assembly.GetManifestResourceStream(actualType.FullName); 

    if (stream == null) 
    { 
     throw new FileNotFoundException("Unable to load the embedded file [" + actualType.FullName + "]"); 
    } 

    var documentSchema = XmlSchema.Read(stream, null); 

    foreach (XmlSchemaExternal xmlInclude in documentSchema.Includes) 
    { 
     var includeStream = xmlInclude.SchemaLocation != "Operations.xsd" 
      ? actualType.Assembly.GetManifestResourceStream(xmlInclude.Id) 
      : typeof (Operations).Assembly.GetManifestResourceStream(xmlInclude.Id); 

     if (includeStream == null) 
     { 
      throw new FileNotFoundException("Unable to load the embedded include file [" + xmlInclude.Id + "]"); 
     } 

     xmlInclude.Schema = XmlSchema.Read(includeStream, null); 
    } 

    return documentSchema; 
} 

Dies ist das Hauptschema:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="ExampleSheet" 
     attributeFormDefault="unqualified" 
     elementFormDefault="qualified" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include id="Operations" schemaLocation="Operations.xsd"/> 
    <xs:element name="ExampleSheet"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Operations" type="Operations"/> 
    </xs:sequence> 
    <xs:attribute name="version" type="xs:string" use="required"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema>  

Und das ist das Schema der Operationen:

<xs:schema id="Operations"  
    elementFormDefault="qualified" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
<xs:element name="Operations" type="Operations"/> 
    <xs:complexType name="Operations"> 
    <xs:choice minOccurs="1" maxOccurs="unbounded"> 
     <xs:element name="Insert" type="Insert"/> 
     <xs:element name="InsertUpdate" type="InsertUpdate"/> 
     <xs:element name="Update" type="Update"/> 
     <xs:element name="Delete" type="Delete"/> 
    </xs:choice> 
    <xs:attribute name="version" type="xs:string" use="required"/> 
    <xs:attribute name="store" type="xs:string" use="required"/> 
    <xs:attribute name="chain" type="xs:string" use="optional"/> 
    </xs:complexType> 
</xs:schema> 

Zum Beispiel, wenn ich eine ExampleSheet mit einem Insert Es ist nicht in der Lage, es zu erkennen. Operations und Insert sind Klassen, die IXmlSerializable implementieren, und die erste ruft die Schemasätze der inneren Typen mit einem benutzerdefinierten XmlSchemaProvider ab.

Mache ich etwas falsch? Wie kann ich meinem ExampleSheet helfen, die Mitglieder von Operations zu akzeptieren? Soll ExampleSheet IXmlSerializable implementieren, damit ich den Reader und den Writer so erstellen kann, wie ich möchte, und wäre das Schema noch nützlich?

+0

es ist schwer dir zu folgen :) - Einfach ausgedrückt, willst du ein Schema von einem anderen referenzieren, ist es das? – NSGaga

+0

@NSGaga ja, von einer anderen Versammlung. Entschuldigung für meine schlechte Erklärung :) –

+0

tut dies http://stackoverflow.com/questions/2357943/whats-the-difference-between-xsdinclude-and-xsdimport – NSGaga

Antwort

2

Statt XmlSchema, haben Sie in die XmlSchemaSet Klasse geschaut?

Ich habe nicht viel mit XML-Serialisierung gemacht, also weiß ich nicht, ob es zu Ihrer aktuellen Anwendung passt, aber ich habe es zuvor in einer ähnlichen Situation verwendet, wo ich auf Typen beziehen muss, die in 3 separaten definiert sind Schemata.

Das vollständige Objekt XmlSchemaSet hat dann Zugriff auf alle Typen in jedem der Schemas.

+0

Danke :) Iterating der XmlSchemaSet und Hinzufügen dieser Typen zum tatsächlichen Schema, arbeitete in meinem GetDocumentSchema! –

Verwandte Themen