XSD.exe - Klassen aus mehreren XSD-Dateien generieren

26/12/2007 - 21:09 von Marco v. Frieling | Report spam
Hallo,

ich habe ein XML Schema aus dem ich C# Klassen generieren muss. Das
funktioniert ja an sich sehr gut, nur ist der Anbieter des Schemata
auf die glorreiche Idee gekommen, sein Schema in zwei Daten
(allgem_000007.xsd und lsta_200801.xsd) aufzuteilen, wobei die Typen
aus beiden Dateien zum gleichen XML Namespace gehören. Rufe ich
xsd.exe nur mit der last_200801.xsd auf, bekomme ich einen Fehler,
dass ein Typ (Simple Type) nicht definiert ist. Dieser ist in der
allg_000007.xsd definiert, wenn ich xsd.exe mit beiden Dateien
aufrufe, làuft es zwar durch, aber es gibt keine C# Entsprechung für
sàmtlich Typen (alles Simple Types) aus der allg_000007.xsd? Hat
xsd.exe da einfach was ignoriert oder generiert es nicht für alle XML
Typen Entsprechungen, insbes. wenn es sich um Einschrànkungen von
Strings über einen regulàren Ausdruck oder von int auf einen
Wertebereich handelt?

BTW: Anbieter des Schemata ist die Oberfinanzdirektion München
(ELSTER) :-( :-(

Vielen Dank und lg,
Marco
email Lesen Sie die DebatteAntworten 7 antwortensAntwortenAntwort

Fragen similare

Lesen sie die antworten

#1 Frank Dzaebel
26/12/2007 - 22:15 | Report spam
Hallo Marco,

ich habe ein XML Schema aus dem ich C# Klassen
generieren muss. Das funktioniert ja an sich sehr
gut, nur ist der Anbieter des Schemata auf die
glorreiche Idee gekommen, sein Schema in zwei Daten
(allgem_000007.xsd und lsta_200801.xsd) aufzuteilen,



hmm, kannst Du mir die XSDs mal mailen?
Zusammen mit dem Befehl den Du anwendest,
die beiden XSD in Klassen umzuwandeln.
Ich mache das (je nach IDE) oft durch simples
Drag & Drop in die Projektmappe, wodurch
(ggf. ->DataSet) automatisch Klassen erstellt werden.

Wenn Du z.B. über /d[ataset]
gehst ist es wiederum auch nicht verwunderlich,
dass nicht alles übernommen wird.
Hmm, /n[amespace]:namespace
wirst Du ja auch kennen ... aber ich
warte mal Deine Angaben ab.
Du solltest auch sagen, welche VS-Version
Du benutzt, da unter 3.5 wieder weitergehende
Möglichkeiten vorhanden sind (auch für XSD.exe).
(BTW. was ist mit Deiner ActiveX-Dll, so gemacht? )

[XML Schema Definition Tool (Xsd.exe)]
http://msdn2.microsoft.com/en-us/li...1kb0s.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Antworten Antwort
#2 Marco v. Frieling
27/12/2007 - 01:13 | Report spam
Hallo Frank,


hmm, kannst Du mir die XSDs mal mailen?
Zusammen mit dem Befehl den Du anwendest,
die beiden XSD in Klassen umzuwandeln.



https://www.imagineclub.at/files/mv...ER-XSD.rar

xsd.exe /c /l:CS /n:MyCompany.Coala.LStA allg_000007.xsd
lsta_200801.xsd

(/c für Klassen, /n legt den .NET Namespace fest, aus einem VS Command
Prompt heraus aufgerufen, in dem sich die beiden Dateien befinden)


Ich mache das (je nach IDE) oft durch simples
Drag & Drop in die Projektmappe, wodurch
(ggf. ->DataSet) automatisch Klassen erstellt werden.



Genau das (DataSet) will ich nicht haben, würde bei dem Schema auch
absolut keinen Sinn machen :-(

Du solltest auch sagen, welche VS-Version
Du benutzt, da unter 3.5 wieder weitergehende
Möglichkeiten vorhanden sind (auch für XSD.exe).



Derzeit noch .NET 2.0. Was gibts denn in 3.5 Neues in dieser Richtung?
Habe morgen ein Meeting mit meiner Auftraggeberin, ggf. ist ein
Umstieg auf 3.5 möglich, falls es genug Argumente dafür gibt. LINQ ist
leider keines, weil das Schema überhaupt nicht LINQ-tauglich ist...


(BTW. was ist mit Deiner ActiveX-Dll, so gemacht? )



Nachdem ich weder im VS 2003, VS 2005 noch VS 2008 eine Möglichkeit
gefunden habe, eine VB 6 ActiveX-Dll zu erstellen und meine MSDN-
Subscription (Vielen Dank noch mal dafür) leider schon im Juli
ausgelaufen ist und ich auf den DVDs kein Visual Studio 6 habe (meine
Auftraggeberin auch nicht), leider nichts. Ich habe zwar Zugang zu
einer MSDN-AA, aber da ist kein Visua Studio 6 enthalten.
Ich habe mich dann irgendwie daran erinnert, dass es mit Hilfe von
managed C++ Class Library Projekten möglich sein soll, natives C++ zu
verwenden und so der .NET Welt zugànglich zu machen, habe ich in die
Richtung gesucht und auch etwas gefunden, ebenso http://ikvm.net. Da
die zu implementierende Komponente eh nur mit Java 1.4 und 1.5
getestet ist (auch wenn es sie schon für 1.6 gibt), ist das relativ
egal dass ikvm noch nicht über Java 1.4 hinaus ist. Morgen wird auch
jemand dabei sein, der sich besser mit C++ auskennt und dann werden
wir entscheiden, welchen Weg wir gehen (oder versuchen zu gehen).

ciao Marco
Antworten Antwort
#3 Frank Dzaebel
27/12/2007 - 08:40 | Report spam
Hallo Marco,

hmm, kannst Du mir die XSDs mal mailen?
Zusammen mit dem Befehl den Du anwendest,
die beiden XSD in Klassen umzuwandeln.


https://www.imagineclub.at/files/mv...ER-XSD.rar



ok.
Ja, da sind (leider) ein Haufen nicht, oder nur partiell von
"Xsd.exe" unterstützter Elemente in diesem Schema!
Nehmen wir z.B. <restriction>.

[Bindungsunterstützung für das restriction-Element]
http://msdn2.microsoft.com/de-de/library/f3z3wh0y(VS.85).aspx
"... Xsd.exe erkennt keine Einschrànkung, die einfachen Inhalt betrifft..."

Aber viele (erweiterte) Attribute werden auch teilweise nicht
oder nur partiell unterstützt:

[Erweiterte Bindungsunterstützung für Attribute der
XML-Schemadefinitionssprache]
http://msdn2.microsoft.com/de-de/library/atdkex8x(VS.85).aspx
(Allgemein suche einfach nach "Bindungsunterstützung" und "XSD")



Derzeit noch .NET 2.0. Was gibts denn in 3.5 Neues in dieser Richtung?
Habe morgen ein Meeting mit meiner Auftraggeberin, ggf. ist ein
Umstieg auf 3.5 möglich, falls es genug Argumente dafür gibt. LINQ ist
leider keines, weil das Schema überhaupt nicht LINQ-tauglich ist...



ok, ich meinte u.a. LINQ, Deine Schema-Klassen sollten sich
aber mit "/eld" bilden lassen. Die Bindungsunterstützung
von XSD.exe hat sich nicht besonders erweitert in der neuen
XSD-Version, insofern kein Grund.



> (BTW. was ist mit Deiner ActiveX-Dll, so gemacht? )
meine MSDN-Subscription (Vielen Dank noch mal dafür)
leider schon im Juli ausgelaufen ist ...



hmm, ohne (richtige) Subscription - ists natürlich schwer.
Ggf. bei einem Freund/Kollegen/Firma mal fragen?


Ich habe mich dann irgendwie daran
erinnert, dass es mit Hilfe von managed C++ Class
Library Projekten möglich sein soll, natives C++ zu
verwenden und so der .NET Welt zugànglich zu
machen, habe ich in die Richtung gesucht und auch
etwas gefunden, ebenso http://ikvm.net.



da gehts Du/Ihr aber "weite" Wege ...
Das geht ~manchmal nach hinten los.
Ihr könntet die Umsetzung in eine ActiveX-Dll
auch fremdvergeben, aber gut, das ist Eure Entscheidung.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Antworten Antwort
#4 Marco v. Frieling
27/12/2007 - 20:01 | Report spam
Hallo Frank,
Ja, da sind (leider) ein Haufen nicht, oder nur partiell von
"Xsd.exe" unterstützter Elemente in diesem Schema!
Aber viele (erweiterte) Attribute werden auch teilweise nicht
oder nur partiell unterstützt



Gibt es denn irgendeine Alternative zu XSD, die davon was unterstützt?

ok, ich meinte u.a. LINQ, Deine Schema-Klassen sollten sich
aber mit "/eld" bilden lassen.


Den Parameter kann ich bei mir in der Hilfe zu xsd nirgends finden,
oder meinst du /e /l /d ?

> Ich habe mich dann irgendwie daran
> erinnert, dass es mit Hilfe von managed C++ Class
> Library Projekten möglich sein soll, natives C++ zu
> verwenden und so der .NET Welt zugànglich zu
> machen, habe ich in die Richtung gesucht und auch
> etwas gefunden, ebensohttp://ikvm.net.

da gehts Du/Ihr aber "weite" Wege ...
Das geht ~manchmal nach hinten los.



IKVM ist sicher ein weiter Weg und da bin ich auch etwas skeptisch
(die Alternative JNBridge sieht besser ausgereifter aus, der Preis
allerdings auch :-( )
Die managed/native C++ Library ist aber an sich ein kürzerer Weg, weil
das Java Native Interface der Java Komponente in C/C++ implementiert
ist und die entsprechende Header-Datei mitgeliefert wird. Die
mitgelieferte VB-Datei ist letztlich auc ein Wrapper um die
mitgelieferte C/C++ Header-Datei.

Ihr könntet die Umsetzung in eine ActiveX-Dll
auch fremdvergeben, aber gut, das ist Eure Entscheidung.


Wir werden es jetzt mal mit der C++ Library angehen und haben dieses
heute fremdvergeben.

Die ganze Schnittstelle is eh ein Graus, aber wenn Behörden soetwas
entwerfen, kommt meist wenig sinnvolles raus...
Es gibt drei Ebenen und für jede ein XML Schema:
1. Transfer-Header
2. Nutzdaten-Header
3. Nutzdaten (viele verschiedene Schemata, etwa Steueranmeldungen, -
bescheinigungen etc.)

Jedes Schema definiert den Inhalt des Tags, welcher den inneren Teil
enthàlt, als Text, weshalb man nicht einfach das Nutzdatenobjekt
(serialisieren und) an den Container übergeben kann, weil der
Serializer dann vom Content einfach alle < und > in &lt; und &gt;
umwandelt. Die generierten Klassen zu adaptieren ist auch nicht
sinnvoll, weil man dann zumindest eine gemeinsame Basis für alle
Nutzaten-Typen schaffen müsste und sich die Schemata in regelmàßigen
Abstànden àndern.
Die beiden Header-Ebenen sind deshalb notwendig, weil die Endanwendung
das XML-Dokument an eine zentrale Stelle schickt, wo das Dokument
entschlüsselt, die Signatur überprüft und es dann je nach Angaben im
Transfer-Header ans zustàndige Finanzamt weitergeleitet wird. Dabei
wird aber keineswegs der komplette Nutzdaten-Header inkl. Nutzdaten
verschlüsselt und komprimiert, sondern lediglich die Nutzdaten und die
Inhalte einzelner Tags des Nutzdatenheaders. Ansonsten hàtte ich mir
das Ganze eh vereinfacht und Verschlüsselung, (GZIP-)Komprimierung,
XML-Signierung und Datenübertragung selbst implementiert anstatt die
Java-Komponente zu verwenden.

lg,
Marco
Antworten Antwort
#5 Frank Dzaebel
28/12/2007 - 11:50 | Report spam
Hallo Marco,

Ja, da sind (leider) ein Haufen nicht, oder nur partiell von
"Xsd.exe" unterstützter Elemente in diesem Schema!
Aber viele (erweiterte) Attribute werden auch teilweise nicht
oder nur partiell unterstützt



Gibt es denn irgendeine Alternative zu XSD, die davon was unterstützt?



Da musst Du mal schauen, wie die Lösungen
zu Deinen Schemas passen, ich habe nur mal ein paar
aufgelistet:

[Ram Marappan : XSDClassgen = XSDObjectGen + .net framework 2.0]
http://www.dotnetjunkies.com/WebLog...49148.aspx

[Automatic C# Class Generator Tool - ADCG]
http://www.adcgtool.com/

[Download details: Sample Code Generator 1.4.2.1] nur .NET 1.1
http://www.microsoft.com/downloads/...x?familyid‰E6B1E5-F66C-4A4D-933B-46222BB01EB0&displaylang=en
(XSDObjectGen builds an enhanced class structure from an XSD schema and
handles many more of the common schema types than the original tool
[xsd.exe]).

[Cs or Vb class generator from XSD - Home]
http://www.codeplex.com/Xsd2Code

[CodeProject: An XSD to .NET language code class generator that adds real
punch to Microsoft's XSD Tool]
http://www.codeproject.com/KB/cpp/CodeXS.aspx

[XSD -> Classes Generator Custom Tool (radically new and extensible)]
http://weblogs.asp.net/cazzu/archiv...nTool.aspx



ok, ich meinte u.a. LINQ, Deine Schema-Klassen sollten sich


> aber mit "/eld" bilden lassen.

Den Parameter kann ich bei mir in der Hilfe zu xsd nirgends finden,
oder meinst du /e /l /d ?



"/eld" ist die Kurzform von "/enableLinqDataSet" das nur
zur Verfügung steht, wenn Du .NET 3.5 hast, aber Du
wolltest ja eh kein DataSet, also erübrigt sich das:

[XML Schema Definition Tool (Xsd.exe)]
http://msdn2.microsoft.com/en-us/li...1kb0s.aspx




Die managed/native C++ Library ist aber an sich
ein kürzerer Weg, weil das Java Native Interface
der Java Komponente in C/C++ implementiert
ist und die entsprechende Header-Datei mitgeliefert
wird.



Ja, sehe ich auch so. Zu der Sinnhaftigkeit
der Form der XSDs kann ich nicht viel sagen,
da ich deren Anforderungen nicht kenne,
aber da hast Du sicher einen guten
Kurz-Abriss geschildert.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Antworten Antwort
Ads by Google
Help eine Frage stellenAnschluss AntwortenAntwort
Search Empfohlene suche