hbspike Geschrieben 30. April 2013 Geschrieben 30. April 2013 Hallo zusammen. Ich hoffe es ist das richtige Unterforum. Ich bin zurzeit dabei ein Programm zuschreiben, mit dessen Hilfe man XML-Daten in eines unserer Systeme importieren kann. Jedoch bin ich auf ein Verständnisproblem gestoßen: Als Beispiel nehme ich jetzt mal einen XSD-Teil der ein Feld autoren beschreibt: <xs:element name="autoren"> <xs:element name="autor" maxOccur="unbounded"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="id" type="xs:string" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:element> Damit ich ja jetzt aus so einer Struktur ein Objekt erhalte, muss ich ja die Klasse Autoren erstellen. Diese hätte dann eine Eigenschaft Autor? Oder eine List<Autor> (Da bin ich mir auch nicht sicher, wie das bei der Umformung funktioniert --> Stichwort "unbounded") Autoren ist in der XML so definiert: <autoren> <autor id="x.xx.xxxx.x.xx"> XXXX X. XXXXX </autor> </autoren> Ich weis das für das Attribut "id" in der Klasse ein Feld vorhanden seien muss, nur wie speichere bzw wo oder im welchem Feld speichere ich nun den Text "XXXX X. XXXXX"? Gibt es dafür ein Default-Feld "content" oder so etwas? ich wäre für eure Hilfe sehr dankbar mfg Chris Zitieren
flashpixx Geschrieben 30. April 2013 Geschrieben 30. April 2013 Lass Dir aus der XSD die Java Klassen via Java Architecture for XML Binding erzeugen, compiliere sie und dann kannst Du via Marshalling / Unmarshaling die Daten als Objekte repräsentieren bzw. serialisieren. Du solltest keine Klassen von Hand erstellen, das führt fast immer zu Inkonsistenzen und damit zu Fehlern im Code Zitieren
hbspike Geschrieben 30. April 2013 Autor Geschrieben 30. April 2013 (bearbeitet) Hi flashpixx. Danke für deine Antwort. Da ich die XSD selbst geschrieben habe (generieren hat nicht funktioniert da das Tool das ich dafür nutze, nicht mit der dtd klar kommt ~.~), zeigt mir Eclipse einen Fehler in der xsd an : <xs:element name="heft"> <xs:complexType> <xs:attribute name="version" type="xs:string" /> <xs:attribute name="jahr" type="xs:string" /> <xs:attribute name="ausgabe" type="xs:string" /> <xs:attribute name="seitevon" type="xs:string" /> <xs:attribute name="seitebis" type="xs:string" /> <xs:attribute name="id" type="xs:string" /> <xs:element name="standpunkt"> <xs:complexType> <xs:attribute name="jahr" type="xs:string" /> <xs:attribute name="ausgabe" type="xs:string" /> <xs:attribute name="seitevon" type="xs:string" /> <xs:attribute name="seitebis" type="xs:string" /> <xs:attribute name="gruppe" type="xs:string" /> <xs:attribute name="id" type="xs:string" /> <xs:element name="kategorie" type="xs:string" /> <xs:element name="titel" type="xs:string" /> <xs:element name="untertitel" type="xs:string" /> <xs:element name="text" type="xs:string" /> <xs:element name="autor" type="xs:string" /> </xs:complexType> </xs:element> ... Eclipse zeigt den Fehler an der Stelle - <xs:element name="standpunkt"> -- mit dem Fehlertext: "s4s-elt-invalid-content.1: The content of '#AnonType_heft' is invalid. Element 'element' is invalid, misplaced, or occurs too often." Was ich nicht verstehe. Siehst du da einen Fehler? Bearbeitet 30. April 2013 von hbspike Zitieren
flashpixx Geschrieben 30. April 2013 Geschrieben 30. April 2013 Da ich die XSD selbst geschrieben habe (generieren hat nicht funktioniert da das Tool das ich dafür nutze, nicht mit der dtd klar kommt ~.~), Ich habe nicht geschrieben, dass Du die XSD generieren lassen sollst, sondern aus der XSD Java Klassen generieren sollst. Dies setzt natürlich voraus, dass die XSD fehlerfrei ist. Element 'element' is invalid, misplaced, or occurs too often. Die Fehlermeldung ist doch eindeutig, entweder falsche Position des Elements bzw es ist zu häufig verwendet. Ansonsten solltest Du die Spezifikation lesen XML Schema Part 2: Datatypes Second Edition Zitieren
hbspike Geschrieben 30. April 2013 Autor Geschrieben 30. April 2013 (bearbeitet) So war der Satz ja auch nicht gemeint. Ich habe nur geschrieben das ich die XSD von Hand geschrieben habe und jetzt Fehler hochkommen. Nein, eindeutig wäre 1 von den 3en. Das ist "raten und ausprobieren"... Und selbst das hilft nicht. Ich habe die xsd analog zu dem Aufbau einer xsd wie in der XML Schema Complex Type - Text Elements beschrieben, aufgebaut. Darum verstehe ich nicht warum der Fehler kommt. Auch sollte die xsd geschachtelte elements verstehen und das es eine maximal Anzahl an <xs:elements> geben soll, kannn ich auch irgendwie nicht glauben. Korrigiere mich wenn ich in diesen Punkten falsch liege... Auch laut der unter xmlschema-1-Definition aufgelisteten Eigenschaften der [element]-Komponente sollte das funktionieren... Bearbeitet 30. April 2013 von hbspike Zitieren
flashpixx Geschrieben 30. April 2013 Geschrieben 30. April 2013 Darum verstehe ich nicht warum der Fehler kommt. Das W3 definiert den Standard, d.h. dies sollte für Dich bindend sein und nicht irgendwelche anderen Seiten. Es gibt für Schemata zwei Versionen, wie Du Deinen Links entnehmen kannst. Ich habe auf Version 2 verlinkt. Für die Lösung Deines Problems müsstest Du nur die Dokumentation lesen z.B. das Kapitel "A Schema for Datatype Definitions (normative)". Zitieren
hbspike Geschrieben 2. Mai 2013 Autor Geschrieben 2. Mai 2013 Ok. Hab es hinbekommen Danke flashpixx Falls es wen interessiert: Wenn <element> = complexType dann muss nach <complexType> ne <sequence> . In die <sequence> kommen die <element>-Eigenschaften des complexType-elements. Die Attribute (<attribute>) müssen nach der <sequence> kommen. Also <element> <complexType> <sequence> <element /> <element /> <element /> </sequence> <attribute /> <attribute /> </complexType> </element> Zitieren
hbspike Geschrieben 2. Mai 2013 Autor Geschrieben 2. Mai 2013 Hallo nochmal. Ich bin auf ein weiteres Problem gestoßen. Die XSD ist jetzt soweit korrekt. Jetzt möchte ich gerne meine XML unmarshallern. Das Problem ist, dass ich in der XML einen Verweis auf die beschreibende DTD habe. Dieser Verweis bringt mich zum verzweifeln. Als Ausgangspunkt (Rohzustand der XML) war in der XML gegeben: <!DOCTYPE heft SYSTEM "diebank.dtd" > Das funktioniert natürlich nicht, da die dtd nicht mehr direkt dort liegt. Laut der Definition muss ich bei SYSTEM eine URI angeben. Dies habe ich auch gemacht. file-URI welche auf die DTD verweist. Beim strg-klick auf den Link wird auch die korrekte Datei geöffnet. <!DOCTYPE heft SYSTEM "file:///C:/Workspace/j2ee/ws1_test_jsf/BvXmlImporter/src/diebank.dtd" > Führe ich jetzt das unmarshalling durch, so wirft mir der SAX-Parser eine Exception: javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException: The system identifier must begin with either a single or double quote character.] at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) ...snip... Caused by: org.xml.sax.SAXParseException: The system identifier must begin with either a single or double quote character. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) ..snip... ... 7 more Entferne ich den : aus der URI, so wirft mir der SAX-Parser eine andere Exception: javax.xml.bind.UnmarshalException - with linked exception: [java.io.FileNotFoundException: \C\Workspace\j2ee\ws1_test_jsf\BvXmlImporter\src\diebank.dtd (Das System kann den angegebenen Pfad nicht finden)] at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:202) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:142) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:151) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:169) at de.bankverlag.xml.importer.Start.testXstream(Start.java:195) at de.bankverlag.xml.importer.Start.main(Start.java:56) Ich habe auch versucht den : zu maskieren, jedoch ohne Erfolg. Hat da wer einen Tipp was ich bei der URI falsch mache(scheinbar bin ich zu blöd das zu sehen)? Ich wäre euch zu dank verpflichtet. Mfg Chris Zitieren
flashpixx Geschrieben 2. Mai 2013 Geschrieben 2. Mai 2013 Ich bin auf ein weiteres Problem gestoßen. Die XSD ist jetzt soweit korrekt. Fein. Das Problem ist, dass ich in der XML einen Verweis auf die beschreibende DTD habe. Brauchst Du die DTD? DTDs sind nicht so flexibel bzw. umfangreich wie eine XSD, d.h. ich würde darauf verzichten und alles als XSD beschreiben. Ich würde falls der Inhalt der DTD notwendig ist einfach das in die XSD übertragen. [org.xml.sax.SAXParseException: The system identifier must begin with either a single or double quote character.] Es klingt danach als sei die DTD nicht valide. javax.xml.bind.UnmarshalException - with linked exception: [java.io.FileNotFoundException: \C\Workspace\j2ee\ws1_test_jsf\BvXmlImporter\src\diebank.dtd (Das System kann den angegebenen Pfad nicht finden)] Generell werden Pfadangaben als URI via / getrennt und nicht \ Schau unbedingt in die Definitionen, ich denke das Problem wird daran liegen, dass Du die Sachen nicht korrekt definierst. Ansonsten rate ich ganz dringend zu entsprechenden Werkzeugen, die den Designprozess unterstützen z.B. AltovaXML oder XML Editor letzteres setze ich seit Jahren ein Zitieren
hbspike Geschrieben 2. Mai 2013 Autor Geschrieben 2. Mai 2013 Hi flashpixx. Mhh. Dann schaue ich mir nochmal die DTD an. Da ich die nicht geschrieben habe, wird das wohl etwas dauern. Zur Info für mich. Ich hab jetzt 2 Möglichkeiten: 1. Die DTD Informationen in die XML einbinden mit [ ... ] im DOCTYPE 2. Die DTD Informationen in die XSD einbinden.. (noch keine Ahnung wie, muss ich dann gucken). Die URI ist natürlich in der XML als: <!DOCTYPE heft SYSTEM "file:///C/Workspace/j2ee/ws1_test_jsf/BvXmlImporter/src/diebank.dtd" > definiert. Die Exception gibt die URI nur irgendwie mit \ aus. Die Editoren schaue ich mir auf jedenfall an! Danke mal wieder flashpixx, du bist echt eine große Hilfe! Mfg Chris Zitieren
flashpixx Geschrieben 2. Mai 2013 Geschrieben 2. Mai 2013 Danke mal wieder flashpixx, du bist echt eine große Hilfe! Vielen Dank, da freue ich mich Zitieren
hbspike Geschrieben 2. Mai 2013 Autor Geschrieben 2. Mai 2013 So. Hab es jetzt auch hinbekommen das marshallen/unmarshallen -.- Es lag an Kommentaren von der externen Firma die die DTD erstellt hat.. Die waren dann mal mittem im Text, aber natürlich auch in mitten von Deklarationen... Um mal ein Beispiel zu geben: <!ENTITY % tm.abstext "(%tm.emph; | br | fnref | objektref | (#PCDATA))+" -- Text im Absatz/Tabellenzelle --> Eine Frage habe ich jedoch noch flashpixx, wenn du noch Lust hast Ich musste, damit die DTD als valide gilt, die Kommentare, ersichtlich durch -- KOMMENTAR -- entfernen, jedoch auch das (#PCDATA). Damit kam JAXB gar nicht klar. Weist du warum das nicht funktioniert? Zitieren
speedi Geschrieben 2. Mai 2013 Geschrieben 2. Mai 2013 Ich nutze zum erstennen von XSDs eigentlich ganz gern speziellere Tools. Sprich sowas wie XML-Spy oder Eclipse-Link (JAXB). Damit brauchst dich mit solchen Problemen gar nicht erst rumschlagen. Mit Link lassen sich dann auch die Sourcen fürs Binding per 3-Mausklicks erzegen. Zitieren
flashpixx Geschrieben 2. Mai 2013 Geschrieben 2. Mai 2013 (bearbeitet) Ich musste, damit die DTD als valide gilt, die Kommentare, ersichtlich durch -- KOMMENTAR -- entfernen, jedoch auch das (#PCDATA). Damit kam JAXB gar nicht klar. Ohne jetzt Deine Daten zu kennen, aber wenn DTD bzw XSD nicht valide ist, dann ist klar, warum es knallt. Ich würde wohl da ansetzen, dass ich mal schauen würde, woher die Invalidität kommt, d.h. also am Erstellungsprozess der DTD schauen. Jedenfalls habe ich auch schon die Erfahrung gemacht, dass XML Dateien schnell per String-Concatination "mal schnell" erzeugt werden. Die Begründung ist dann meist "ist ja nur Text mit so komischen Tags drin". Siehe z.B. Dokumenttypdefinition dort steht, dass das Feld auch Infos für den Parser enthalten kann, ich würde mal darauf tippen, dass in Deinem Fall die Daten, die in dem Feld stehen eben als Parseranweisungen interpretiert werden. Ich würde auch da wieder ganz klar der Definition folgen. Es ist immer ein guter Ansatz dort zu beginnen, wo die Definitionen herkommen (sofern sie automatisch erzeugt werden). P.S. Der Link zu Altova XMLSpy. Ich kann definitiv während des Designprozesses dazu raten, solche Tools einzusetzen, weil es einmal die Arbeit enorm unterstützt und eben dazu führt, dass invalide Strukturen vermieden werden. Bearbeitet 2. Mai 2013 von flashpixx Zitieren
hbspike Geschrieben 2. Mai 2013 Autor Geschrieben 2. Mai 2013 Ich würde wohl da ansetzen, dass ich mal schauen würde, woher die Invalidität kommt, d.h. also am Erstellungsprozess der DTD schauen. Würde ich auch gerne, geht leider nicht. Zur Info. Ich verarbeite Zeitungsartikel die auf CDs gepresst wurden. Die Rohdaten für die CDs sind in XML-Form vorhanden. Das Problem: Es sind Daten aus 2004 bis heute. Die DTD wurde nur leider 2004 erstellt und auch nicht von uns (von einer externen Firma), daher kann ich da nichts mehr dran drehen. Ich hab es jetzt hinbekommen die Daten aus der XML zu extrahieren... Toll nur das die XML nicht konsistent im Aufbau sind, was mir gerade mal so richtig die Laune verdirbt ... Naja.. Arbeit arbeit Ich danke euch auf jedenfall. Sehr toll Faden kann geschlossen werden Mfg Chris Zitieren
flashpixx Geschrieben 2. Mai 2013 Geschrieben 2. Mai 2013 (bearbeitet) Ich hab es jetzt hinbekommen die Daten aus der XML zu extrahieren... Toll nur das die XML nicht konsistent im Aufbau sind, was mir gerade mal so richtig die Laune verdirbt ... sollte eigentlich kein Problem darstellen, definiere Dein eigenes XML Format was Du liest und überführe die Daten-XML via XSL Transformation mittels XQuery und The SAXON XSLT and XQuery Processor in Dein Zielformat. Du musst lediglich für jede XML eine Transformation erstellen, die in Dein Format transformiert. Die sollte aber deutlich flexibler / schneller machbar sein, als den DOM einzeln zu verarbeiten, d.h. in Deinem Fall definiere Dein XML Format, erzeuge dazu eine passende XSD, transformiere diese mittels JaxB in Java Klassen für das Marschalling. Schreibe eine XSLT, die die Daten-XML in Dein Format transformiert (ggf vice versa, damit Du Deine Daten wieder zurück transformieren kannst). Die XSLT holt sich dann mittels XQuery die entsprechenden Daten aus der XML und baut sie entsprechend zusammen. Mit den genannten Tools lassen sich solche Transformationen meist sogar per Drag-and-Drop erzeugen. Bearbeitet 2. Mai 2013 von flashpixx Zitieren
hbspike Geschrieben 2. Mai 2013 Autor Geschrieben 2. Mai 2013 Jo flashpixx, genau das habe ich gemacht. XSD anhand der XML erstellt. Aus der XSD die JAXB-Klassen generieren lassen. Die einzige "heft"-xml funktioniert, der Rest sind "artikel"-xml .. Manche gehen, manche nicht da: The content of elements must consist of well-formed character data or markup. Da muss ich wohl Hand an die XML legen... Zitieren
flashpixx Geschrieben 2. Mai 2013 Geschrieben 2. Mai 2013 Da muss ich wohl Hand an die XML legen... Jo, nicht valide Dokumente wird auch der beste Parser nicht verarbeiten können. Wenn man XML einsetzt, sollte man sich dessen bewusst sein (ich verkneif mir mal den sarkastischen Spruch bezüglich Deiner Daten, aber ich kann das Problem sehr gut nachempfinden) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.