2009-03-24 16 views
0

Wenn ich eine XML-Beispieldatei verwenden, um eine XSD zu generieren, mit Visual Studio und Oxygen, generiert es eine Datei mit Tonnen <xs:element ref="ELEMENTNAME" />, wobei Elementname ist ein tatsächlicher Elementname. Später in der Datei hat es ein Element <xs:element name="ELEMENTNAME" type="xs:string" />, wo es definiert, was das Element ist. Zum Beispiel, hier ist ein Auszug:Generiere XSD-Datei ohne REF-Elemente - Ich möchte nur eine "literal" XSD-Datei

<xs:element name="Header"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="VersionNumber" /> 
     <xs:element ref="BillerGroupID" /> 
     <xs:element ref="BillerGroupShortName" /> 
     <xs:element ref="BillerID" /> 
     <xs:element ref="BillerShortName" /> 
     <xs:element ref="FileIndicator" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="VersionNumber" type="xs:string" /> 
<xs:element name="BillerGroupID" type="xs:string" /> 
<xs:element name="BillerGroupShortName" type="xs:string" /> 
<xs:element name="BillerID" type="xs:string" /> 
<xs:element name="BillerShortName" type="xs:string" /> 
<xs:element name="FileIndicator" type="xs:string" /> 

Hier ist das Problem - ich bin mit Microsoft Biztalk, und es sieht jeden einzelnen „Element“ Tag als verfügbares Schema, weil sie alle auf der obersten Ebene sind - Kopfzeile, zusammen mit jedem einzelnen Kindelement. Ich möchte nur ein Schema verfügbar machen - in diesem Fall den Header - und den Rest ausblenden.

Die offensichtliche Lösung manuell zu sein scheint, dass meine Datei bearbeiten so aussehen, manuell die REF-Anweisungen entfernen:

<xs:element name="Header"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="VersionNumber" type="xs:string" /> 
     <xs:element name="BillerGroupID" type="xs:string" /> 
     <xs:element name="BillerGroupShortName" type="xs:string" /> 
     <xs:element name="BillerID" type="xs:string" /> 
     <xs:element name="BillerShortName" type="xs:string" /> 
     <xs:element name="FileIndicator" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Da jedoch meine Datei sehr groß ist und Tausende von Elementen enthält, ist dies nicht wirklich machbar. Gibt es eine Möglichkeit, meinem Tool zu sagen, dass es die Datei generieren soll, ohne REFs zu verwenden, sondern stattdessen eine Kopie des Elements an die Stelle stellt, an der es statt auf der Stammebene sein soll?

Antwort

3

Wenn Sie ein Visual Studio BizTalk-Projekt haben, können Sie "Generierte Elemente hinzufügen" und dann "Schemas generieren" auswählen.

In der Dropdown-Liste wählen Sie "Well formed xml", wenn niemand diese Option verwendet, bevor Sie ein Skript ausführen müssen, um es zu aktivieren, siehe Link unten.

VS wird jetzt die gewünschte Art von Schema generieren. Sie müssen Datentypen anpassen, wenn VS falsch erraten :)

diese Probe Person Siehe Add generated schemas

+0

Ich musste die "Well-formed XML" Option installieren, aber es funktionierte wie ein Charme, ohne eine einzige REF. Danke für deinen Tipp! – SqlRyan

0

Ich vermute, es wäre relativ einfach, eine XSLT zu schreiben, die diese Transformation für Sie durchführt. Sie können die ref-Attribute erkennen und den Wert in XPath verwenden, um die richtige Definition zu finden, und diese dann in die Ausgabe kopieren. Sollte nicht sehr schwer zu schreiben sein.

+0

ich die Transformation schreiben kann, aber warum kann das Werkzeug nur die Datei, die Art und Weise in erster Linie erzeugen? Ich verstehe den Punkt der REF, wenn Sie mehrere Kopien eines Elements haben, aber es scheint, dass ich in der Lage sein sollte, eine Box zu überprüfen, die eine Datei ohne sie erstellt. – SqlRyan

+0

Scheint, Sie suchen nach den Tools, um die Mängel von etwas anderem zu umgehen. Sie werden wahrscheinlich ein Tool finden, das es irgendwo macht, aber das XSLT ist wahrscheinlich schneller zu schreiben und bedeutet, dass Sie kein weiteres Werkzeug hinzufügen müssen. –

0

Welche Version von VS verwenden Sie? Ich habe versucht, Ihr Beispiel in Visual Studio 2008, und es erzeugt die XSD die Art und Weise, die Sie scheinen es zu wollen:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Header"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="VersionNumber" type="xs:string" /> 
     <xs:element name="BillerGroupID" type="xs:string" /> 
     <xs:element name="BillerGroupShortName" type="xs:string" /> 
     <xs:element name="BillerID" type="xs:string" /> 
     <xs:element name="BillerShortName" type="xs:string" /> 
     <xs:element name="FileIndicator" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Es sieht aus wie VS 2005 das gleiche tun würde.

Ich habe die VS-Optionsdialoge durchgesehen, aber nichts gesehen, das steuern würde, wie das XSD generiert wird. (Vielleicht gibt es irgendwo eine Konfigurationsdatei?)

+0

Obwohl dies an dem kleinen Beispiel funktioniert, das ich zur Verfügung gestellt habe, erzeugt es immer noch ein Schema mit vielen REFs, wenn ich die gesamte XML-Datei in VS2008 durchführe. Danke für die Idee! – SqlRyan