2010-01-26 20 views
7

Aus irgendeinem Grund, MS.Net (v3.5) -Tool - xsd.exe generiert keine Typen, wenn sie nicht in einem Element verwendet werden..Net xsd.exe-Tool generiert nicht alle Typen

z.B.

XSD-Datei (ich in dem komplexen Elemente warf diese Warnung zu vermeiden - „Warnung:. Kann keine Klassen erzeugen, da keine Top-Level-Elemente mit komplexem Typ gefunden wurden“):

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:simpleType name="EnumTest"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="item1" /> 
     <xs:enumeration value="item2" /> 
     <xs:enumeration value="item3" /> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:complexType name="myComplexType"> 
    <xs:attribute name="Name" use="required" type="xs:string"/> 
    </xs:complexType> 
    <xs:element name="myElem" type="myComplexType"></xs:element> 
</xs:schema> 

Wenn ich laufe diese thru xsd.exe mit

xsd/c xsdfile.xsd

ich sehe EnumTest nicht in der generierten cs-Datei.

Hinweis; Obwohl ich die enum hier nicht verwende, aber in meinem eigentlichen Projekt, habe ich Fälle wie diese, wo wir den String-Wert von enum als Ausgabe senden.

Wie kann ich das xsd-Tool dazu zwingen, diese einzuschließen? Oder sollte ich zu einem anderen Werkzeug wechseln?

ich in Visual Studio arbeiten 2008

+0

Ihre simple wird nicht durch Elemente verwendet ... Verwenden Sie es, versuchen Sie es erneut. –

+0

ich schätze du hast meine post nicht komplett gelesen! – Mrchief

+1

Ich habe deinen Beitrag gelesen. Wenn jedoch kein Element den Typ verwendet, wird das System keinen Typ definieren. Fügen Sie hinzu und sehen Sie, was es macht. (Es ist eine Optimierung Dingie ...) –

Antwort

5

Ich muss werde schließen dies eine dumme Manko des Werkzeugs ist. Vielleicht geben Sie einen Schalter, um dieses Verhalten zu aktivieren. Ohne dieses Verhalten bin ich gezwungen, Typen außerhalb von xsd zu erstellen, die fragmentierten Code erstellen.

Dies ist meine persönliche Meinung und ich bin mir ziemlich sicher, dass es andere gibt, die das gleiche teilen.

+0

Das Tool generiert Klassen für das Schema. Wenn das Schema beispielsweise den XAML-Namespace enthalten würde, müsste es ohne die von Wim ten Brink angegebene Optimierung Klassen für fast die gesamte XML-Welt erstellen. Dies ist im Allgemeinen unerwünscht. Wenn die Elemente im Schema nicht referenziert sind, werden sie weggelassen. – Pekka

+0

Das ist ein Randfall und ich sage nicht, dass es für jeden Import gemacht wird. Nur für mein Schema. Aber wiederum können Sie Schalter haben, um die Granularität zu steuern. – Mrchief

+0

Ich hätte gedacht, dass das eXtensible in XML stark andeutet, dass die meisten Schemata andere importieren würden, aber dass die meisten Software nur an ihren lokalen Typen interessiert bleiben würden, während der Rest der Daten als nicht interpretierte Nutzlast übrig bleibt. Es kann auch ein Missverständnis geben. Elemente sind die öffentliche Schnittstelle, während Typen die Notation erleichtern. Sie können die Elemente immer mit anonymen Typen definieren, wenn Sie nur eine Art von benanntem Artefakt im Schema haben möchten. – Pekka

0

Wenn Sie die Enum nicht hier verwenden, oder in einer anderen Klasse sind Sie durch die XSD-Werkzeug zu erzeugen, definieren sie dann in Ihrem Projekt woanders genauso wie würde irgendein anderes enum. Wenn Sie unbedingt das xsd-Tool benötigen, um eine Klasse für Sie zu erstellen, dann ist Workshop Alex 'Lösung die am häufigsten verwendete Problemumgehung in diesem Fall (ich halte es nicht einmal für eine Umgehungslösung, es ist wirklich sehr praktisch, das zu verwenden Werkzeug auf diese Weise)

1

Ich stieß auf ein ähnliches Problem, mit xs:complexType nicht in einem xs:element, und damit nicht in der generierten CS-Datei enthalten sein. In unserem Szenario haben wir eine WSDL-Datei, die zwei xsd-Dateien importiert, so dass dies möglicherweise nicht für Sie gilt.

Statt xsd.exe auf diese beiden XSD-Dateien laufen, wir haben die folgenden:

wsdl.exe /language:CS /out:OutputDir OurService.wsdl first.xsd second.xsd 

, der wie ein Charme, und erzeugt alles, einschließlich der komplexen Typen.

+0

Ja, das war zu dieser Zeit eine andere Option. Sogar WCFs Generator handhabt das korrekt, aber nicht sicher. Ich bin schon lange nicht mehr bei xsd, kann also nicht sicher sprechen. – Mrchief

2

Es ist möglich, Enums innerhalb der XSD-Datei zu erstellen, auch wenn Sie nicht beabsichtigen, sie für die Validierung zu verwenden.Fügen Sie die folgenden XSD:

<xs:element name="DummyEnumTest" type="EnumTest" abstract="true" block="#all"/> 

(wo EnumTest ist die Enum Sie sehen möchten, generiert).

Das Attribut abstract stellt sicher, dass das Element nicht die Rolle des Dokumentelements eines Instanzdokuments spielen kann. Das Attribut block ist weniger wichtig.

Es gibt andere Möglichkeiten, dasselbe Ziel zu erreichen, wie das Deklarieren eines verbotenen Attributs mit Ihrem aufgezählten Typ, wo immer Sie möchten. Ich finde es nützlich, wie dies alle meine nicht genutzten Aufzählungen innerhalb eines generischen Wrapper zu verkapseln, globale Erklärungen zu minimieren:

<xs:element name="ForceGenerationOfBaseEnums" abstract="true" block="#all"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:element name="..." type="..."/> 
      <xs:element name="..." type="..." /> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 
+0

Das bringt mich wieder zu meiner anfänglichen Kritik - es zwingt Sie dazu, mindestens ein unbenutztes 'Element' für die Generierung zu deklarieren. – Mrchief

+0

@Mrchief - 'xsd.exe' ist ein dünner Wrapper um .NET-Klassen. Es gibt nichts Magisches um ihn herum. Laden Sie die Quelle von 'Xsd2Code' herunter, welches ein Open-Source-Wrapper ähnlicher Art ist (viel flexibler als' xsd.exe' auf jeden Fall) und verwenden oder an Ihre Bedürfnisse anpassen, wenn Sie kosmetische Unvollkommenheiten von 'xsd.exe' nicht akzeptieren können . Sehen Sie sich auch [diese Frage] an (http://stackoverflow.com/questions/386155/comparison-of-xsd-codegenerators-c). –

Verwandte Themen