Konvertiere DTD in XSD mit definiertem Root (Start) Element

8

Ich habe mehrere große DTD-Dateien. Ich habe trang verwendet, um sie in XSD-Dateien umzuwandeln, so dass ich sie problemlos von JAXB und anderen Dienstprogrammen verwenden konnte. Die generierte XSD-Datei hat jedoch alle Elemente auf der obersten Ebene deklariert. Dies bedeutet, dass jedes Element das Stammelement einer XML-Eingabe sein kann. Ich möchte nur ein bestimmtes Element angeben.

Das Vorhandensein dieser mehreren Wurzelelemente verursacht einige Probleme, z. xjc generiert @XmlRootElement für alle Klassen, daher muss ich weitere zusätzliche Prüfungen hinzufügen.

Wie ich verstehe, muss ich das generierte XSD umschreiben, <xs:element> s in <xs:complexType> s verschieben, element ref s in element type s ändern usw., aber das wäre zu viel Affenarbeit mit keine Möglichkeit zu überprüfen, ob alles richtig gemacht wurde.

Gibt es einen effizienteren Weg, dies zu tun?

    
kan 24.05.2012, 10:16
quelle

2 Antworten

0

Ich habe eine einfache XSLT-Transformation verwendet, um das generierte XSD zu verarbeiten. Funktioniert gut für meinen Fall:

%Vor%

Er erkennt referenzierte Elementdefinitionen und macht sie zu comptexType s, wobei Refs geändert werden. Alle nicht referenzierten Elemente werden zu Startelementen.

    
kan 28.05.2012, 09:20
quelle
0

Von dem, was Sie beschreiben, und der "Treue" der Konvertierung ignorierend, wie in einigen der Kommentare erwähnt, habe ich nur mit der Tatsache zu tun, dass Sie einfach nach einem automatischen Weg suchen (was ich nenne) ) XML-Schema-Refactoring . Ich bin mit QTAssistant verbunden, einem Produkt, das für diese Art von Arbeit gedacht ist, also würde ich es so machen ...

Eine Sache, die Sie von Hand erledigen müssen, ist, was auch immer passiert, die Liste der Elemente, die Sie als root (oder nicht) sehen möchten ... und Sie sind fertig: Drücken Sie eine Taste, oder Rufen Sie eine Befehlszeile auf, und Sie werden sicher wissen, ob eine gültige XSD generiert wird.

Eine Refactoring-Engine verwendet ein Besuchermuster, das in Ihrem Fall im Wesentlichen das tut, was Sie brauchen: erstellt bei Bedarf globale Typen, entfernt unerwünschte globale Elementdefinitionen und ersetzt alle refedierten Elemente durch Inline-Deklarationen.

(Für jeden, der das liest, der Substitutionsgruppen kennt, ersetzt dieses Refactoring keinen Verweis auf einen Kopf einer Substitutionsgruppe; da es sich um ein XSD von einer DTD handelt, ist dies hier kein Problem).

Diese Einfachheit und die Tatsache, dass sie wiederholbar und zuverlässig ist, wären die Hauptvorteile der Verwendung eines spezialisierten Refactoring-Tools; Ein weiterer Vorteil: Sie können XML-Namespaces auch beliebig neu zuweisen ...

Wenn Sie an weiteren Details interessiert sind, lassen Sie es mich wissen und ich werde diesen Beitrag mit einem kleinen Beispiel und einigen Illustrationen aktualisieren.

    
Petru Gardea 25.05.2012 18:23
quelle

Tags und Links