XML - schreiben und einlesen (Schema)

Status
Nicht offen für weitere Antworten.
J

jaja

Gast
Servus Leute!

zum Ersten hätte ich eine Frage bezüglich des Schreibens einer XML Datei:

Vorgegeben ist mir folgendes Schema:
Code:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

als XML-Beispiel sieht der Header dann so aus:
Code:
<markierungen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="markierung.xsd">

Meine Frage ist nun, wie ich diese "Parameter" in den Header einer XML Datei setzen kann ???

zum Zweiten folgendes:

Gegeben ist mir ein Schema, dass wie folgt eingelesen wurde:

Code:
SchemaFactory sfactory = SchemaFactory
    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
StringReader reader = new StringReader("<xs:schema xmlns:xs=\""
    + "http://www.w3.org/2001/XMLSchema\" elementFormDefault=\""
    + "qualified\">"
    + " <xs:element name=\"markierungen\">"
    + "  <xs:complexType>"
    + "   <xs:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">"
    + "    <xs:element name=\"markierung\" >"
    + "     <xs:complexType>"
    + "      <xs:sequence>"
    + "       <xs:element name=\"id\" type=\"xs:integer\"/>"
    + "       <xs:element name=\"text\" type=\"xs:string\"/>"
    + "       <xs:element name=\"farbe\" type=\"xs:string\"/>"
    + "       <xs:element name=\"position\" type=\"xs:integer\"/>"
    + "       <xs:element name=\"laenge\" type=\"xs:integer\"/>"
    + "       <xs:element name=\"datum\" type=\"xs:string\"/>"
    + "       <xs:element name=\"kommentar\" type=\"xs:string\"/>"
    + "      </xs:sequence>"
    + "     </xs:complexType>"
    + "    </xs:element>"
    + "   </xs:sequence>"
    + "  </xs:complexType>"
    + " </xs:element>"
    + "</xs:schema>");
StreamSource source = new StreamSource(reader);
Schema schema = sfactory.newSchema(source);

Wie und mit welcher Java-Bibliothek kann ich entsprechend dieses Schemas andere XML Files auslesen? Ich wäre über ein kleines Codebeispiel oder einen Link in die Richtung sehr dankbar, da ich mich mit XML nicht so wirklich gut auskenne.
Wichtig ist hierbei auch noch, dass uns keine fremden Bibliotheken hierzu erlaubt sind!

Vielen Dank !!!
 

Wildcard

Top Contributor
Normalerweise lässt man sich aus einem XML Schema Java Klassen erzeugen. Dafür wird ein XML Binding Framework wie JaxB oder EMF verwendet. Wenn das bei dir nicht möglich ist, bleibt dir wohl nur SAX.
 
J

jaja

Gast
mmh, der Aufgabetellung zu folge müssen wir XML-Files auslesen und haben dafür dieses Schema gegeben.

Habe irgendwo gelesen, dass dies mit JSax gehen solle... Ich habe aber leider keine Ahnugn wie und aus google werde ich leider auch nicht schlau.

Kann mir da einer bisschen mehr zu sagen, bzw. mal n kleine sBsp machen :/

Das wäöre echt super..


Ausserdem hab ich auch meine erste Frage leider nicht beantworten können...

Danke für Eure Hilfe!
 
J

jaja

Gast
Hallo!

zu 1)
Also, schreiben tue ich wie folgt:

Code:
XMLOutputFactory factory = XMLOutputFactory.newInstance(); 
         
            XMLStreamWriter writer = factory.createXMLStreamWriter(out);
            
            writer.writeStartDocument();
            writer.writeStartElement("markierung");
..........


zu 2)
Zu den Libs:

Ich darf keine fremden Libs verwenden, sprich alle regulären Libs aus der Java API sind erlaubt...

Und gegeben ist ein Schema und ich muss mit diesen "Standart-Libs" XML Files entsprechend dem Schema auslesen.


Danke für den Link, in der Insel hatte ich das Zeug schon gelesen. Komme aber leider trotzdem nicht mit oben genannten Problem weiter.. :(

thx !
 
G

Guest

Gast
mmmh. und welche möglichkeiten gibt es mit standard-libs diese Aufgabenstellung zu lösen ??? :?
 

Wildcard

Top Contributor
Was stört dich an dem Beispiel in der Javainsel?
Code:
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document document = builder.parse( new File("party.xml") ); 
    System.out.println( document.getFirstChild().getTextContent() );
 
G

Guest

Gast
mh, weil da das Schema nicht berücksichtigt wird?!?

oder in wie fern muss das beim auslesen eingfebaut werden ?!?


Ich poste nochmal n kleines Stück aus meiner Aufgabenstellung, vielleich thilft dir das:

Wichtiger Hinweis: Bitte verwenden Sie zur Lösung dieser Aufgabe ausschließlich die von Java bereitgestellten Klassen. Verwenden Sie keine fremden Bibliotheken!

Bitte achten Sie darauf, dass Ihr Programm das Schema markierung.xsd nicht über Dateioperationen einliest. Verwenden Sie z.B. folgenden Code:

Code:
SchemaFactory sfactory = SchemaFactory
    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
StringReader reader = new StringReader("<xs:schema xmlns:xs=\""
    + "http://www.w3.org/2001/XMLSchema\" elementFormDefault=\""
    + "qualified\">"
    + " <xs:element name=\"markierungen\">"
    + "  <xs:complexType>"
    + "   <xs:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">"
    + "    <xs:element name=\"markierung\" >"
    + "     <xs:complexType>"
    + "      <xs:sequence>"
    + "       <xs:element name=\"id\" type=\"xs:integer\"/>"
    + "       <xs:element name=\"text\" type=\"xs:string\"/>"
    + "       <xs:element name=\"farbe\" type=\"xs:string\"/>"
    + "       <xs:element name=\"position\" type=\"xs:integer\"/>"
    + "       <xs:element name=\"laenge\" type=\"xs:integer\"/>"
    + "       <xs:element name=\"datum\" type=\"xs:string\"/>"
    + "       <xs:element name=\"kommentar\" type=\"xs:string\"/>"
    + "      </xs:sequence>"
    + "     </xs:complexType>"
    + "    </xs:element>"
    + "   </xs:sequence>"
    + "  </xs:complexType>"
    + " </xs:element>"
    + "</xs:schema>");
StreamSource source = new StreamSource(reader);
Schema schema = sfactory.newSchema(source);
 

Wildcard

Top Contributor
Du meinst sowas?
Code:
public class SchemaDemo {
	public static void main(String[] args) throws Exception{
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setSchema(createSchema());
		Document doc = factory.newDocumentBuilder().parse(new File("your.xml"));  
	}

	private static Schema createSchema() {
		SchemaFactory sfactory = SchemaFactory
	    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
	StringReader reader = new StringReader("<xs:schema xmlns:xs=\""
	    + "http://www.w3.org/2001/XMLSchema\" elementFormDefault=\""
	    + "qualified\">"
	    + " <xs:element name=\"markierungen\">"
	    + "  <xs:complexType>"
	    + "   <xs:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">"
	    + "    <xs:element name=\"markierung\" >"
	    + "     <xs:complexType>"
	    + "      <xs:sequence>"
	    + "       <xs:element name=\"id\" type=\"xs:integer\"/>"
	    + "       <xs:element name=\"text\" type=\"xs:string\"/>"
	    + "       <xs:element name=\"farbe\" type=\"xs:string\"/>"
	    + "       <xs:element name=\"position\" type=\"xs:integer\"/>"
	    + "       <xs:element name=\"laenge\" type=\"xs:integer\"/>"
	    + "       <xs:element name=\"datum\" type=\"xs:string\"/>"
	    + "       <xs:element name=\"kommentar\" type=\"xs:string\"/>"
	    + "      </xs:sequence>"
	    + "     </xs:complexType>"
	    + "    </xs:element>"
	    + "   </xs:sequence>"
	    + "  </xs:complexType>"
	    + " </xs:element>"
	    + "</xs:schema>");
	StreamSource source = new StreamSource(reader);
	Schema schema;
	try {
		schema = sfactory.newSchema(source);
		return schema;
	} catch (SAXException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
	}
}
 
G

Guest

Gast
hey, super..! genau sowas habe ich gesucht! :)

vielen dank!

jetzt bleibt mir nur noch eine Frage:

ich habe dieses Document als org.w3c.dom.Document importiert. Hoffe das ist das richtge, gehe aber mal von aus!

Wie kann ich jetzt die einzulesene XML datei über eine schöne for-schleife beispielsweise die einzelnen TextContents abfragen ?

Ich konnte nur doc.getFirstChild() beispielsweise finde. Eine Methode getNextChild() oder sowas würde das ganze ja schon einfacher machen. Auch vermisse ich eine Methode, die beispielsweise alle Kinder ausspuckt à la doc.getChildreen() oder sowas?!?

Ich denke, Du weißt was ich meine... So iterator mäßig.

Denn versuche ich doc.getFirstChild().getTextContent() beispielsweise kriege ich nur einen großen Strign ausgespuckt und mit regex zB will ich da nicht dran, da es mit Sicherheit eleganter geht.

Vielen Dank für Deine hilfe!!
 
G

Gast

Gast
Mmmh, ich habe leider immer noch eine Fehlermeldung, die allerdings nur machmal kommt, komischweise:

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at NotizSpeicher.lese(NotizSpeicher.java:310)
at Ausgabe.actionPerformed(Ausgabe.java:262)
at java.awt.MenuItem.processActionEvent(Unknown Source)
at java.awt.MenuItem.processEvent(Unknown Source)
at java.awt.MenuComponent.dispatchEventImpl(Unknown Source)
at java.awt.MenuComponent.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Die jeweilige XML datei spuckt dann folgendes aus:

Die XML-Seite kann nicht angezeigt werden
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet XSL verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.


--------------------------------------------------------------------------------

Im Textinhalt wurde ein ungültiges Zeichen gefunden. Fehler beim Bearbeiten der Ressource 'file:///C:/Dokumente und Einstel...

</text><farbe>Gr


Zeile 310 von NotizSpeicher sieht so aus (da wirft er die Ecxeption):

Code:
            doc = factory.newDocumentBuilder().parse(in);

Hat da jemand ne Ahnung?!

Habe schon versucht dem Fehler auf den Grund zu gehen. Habe IE7, aber der Fehler sit immer noch da.

Schreibe ich vielleicht falsch die XML Files ??? Manchmal gehn sie aber, manchmal nicht. Irgendwie ziemlich komisch.

Meine Methode zum Schreiben:

Code:
public void schreibe(OutputStream out) throws IOException {

        // Initialisiert die entsprechenen Objekte um in die XML-Datei
        // mit Hilfe des FileOutputStreams zu schreiben. Der Name der Datei
        // wurde schon in der Ausgabe.java dem OutputStream uebergeben
        XMLOutputFactory factory = XMLOutputFactory.newInstance();

        try {
            XMLStreamWriter writer = factory.createXMLStreamWriter(out);

            writer.writeStartDocument();
            writer.writeStartElement("markierungen");

            Markierung mark;
            for (int i = 0; i < this.getDats().size(); i++) {

                writer.writeStartElement("markierung");

                mark = this.getDats().get(i);

                writer.writeStartElement("id");
                writer.writeCharacters(this.ids.get(i).toString());
                writer.writeEndElement();

                writer.writeStartElement("text");
                writer.writeCharacters(mark.getText());
                writer.writeEndElement();

                writer.writeStartElement("farbe");
                writer.writeCharacters(mark.getFarbe());
                writer.writeEndElement();

                writer.writeStartElement("position");
                writer.writeCharacters(Integer.toString(mark.getPosition()));
                writer.writeEndElement();

                writer.writeStartElement("laenge");
                writer.writeCharacters(Integer.toString(mark.getLaenge()));
                writer.writeEndElement();

                writer.writeStartElement("datum");
                writer.writeCharacters(mark.getDatum());
                writer.writeEndElement();

                writer.writeStartElement("kommentar");
                writer.writeCharacters(mark.getKommentar());
                writer.writeEndElement();

                writer.writeEndElement();
            }

            writer.writeEndElement();
            writer.writeEndDocument();
            writer.close();
        } catch (XMLStreamException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

und die Methode zum Lesen (die inZeile 310 - siehe oben den Fehler wirft):

Code:
public void lese(InputStream in) throws IOException, SAXException {
        
        this.ids = new ArrayList();
        this.id = 0;
        this.dats = new Vector<Markierung>();        

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setSchema(createSchema());
        Document doc;
        
        try {
            doc = factory.newDocumentBuilder().parse(in);

            // "markierungen"
            NodeList markierungen = doc.getChildNodes();

            // "markierung"
            NodeList markierung = markierungen.item(0).getChildNodes();

            for (int i = 0; i < markierung.getLength(); i++) {

                NodeList inhalt = markierung.item(i).getChildNodes();

                Markierung neu = new Markierung();

                for (int x = 0; x < inhalt.getLength(); x++) {

                    // x == 0 ist die id, die muss allerdings nicht gesetzt
                    // werden sondern wird ueber markierungEinfuegen automatisch
                    // gesetzt

                    switch (x) {
                        case 1:
                            neu.setText(inhalt.item(x).getTextContent());
                            break;
                        case 2:
                            neu.setFarbe(inhalt.item(x).getTextContent());
                            break;
                        case 3:
                            neu.setPosition(Integer.parseInt(inhalt.item(x).getTextContent()));
                            break;
                        case 4:
                            neu.setLaenge(Integer.parseInt(inhalt.item(x).getTextContent()));
                            break;
                        case 5:
                            neu.setDatum(inhalt.item(x).getTextContent());
                            break;
                        case 6:
                            neu.setKommentar(inhalt.item(x).getTextContent());
                            break;
                    }
                }
                
                this.markierungEinfuegen(neu);
            }
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


Danke für Eure Hilfe !
 
G

Guest

Gast
-------------------------------------------------------------------------------
hat ich erledigt
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Validierung nur beim einlesen oder auch beim schreiben? XML & JSON 4
J wert IN einem tag einlesen/schreiben XML & JSON 4
B XML einlesen und in Datenbank schreiben XML & JSON 1
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
W XPath schreiben XML & JSON 1
N Java XML schreiben funktioniert nicht XML & JSON 1
L Mit Hilfe von POI eine Tabelle ohne Rahmen in Word schreiben XML & JSON 2
J XML als stream schreiben? XML & JSON 2
M JAXB: automatisches Groß schreiben Property XML & JSON 9
L Datenstruktur in XML-File schreiben XML & JSON 2
G DXF-File schreiben XML & JSON 17
P Komfortabel XML Dokumente schreiben und lesen XML & JSON 6
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
S XML lesen und schreiben XML & JSON 2
C DOM: Attribute nicht in alphabetischer Reihenfolge schreiben XML & JSON 3
T Schreiben einer XML XML & JSON 8
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
K '&' in xml schreiben XML & JSON 2
G Problem beim schreiben von XML in eine File XML & JSON 2
sylo DOM Document in XML Datei schreiben XML & JSON 5
J xmlencoder Zustände einer Bean schreiben XML & JSON 3
B eigentlich einfach nur XML schreiben XML & JSON 3
L Objekt Serialisierung: Schreiben aller Attribute erzwingen XML & JSON 5
A JDOM: Wert schreiben bzw. ändern XML & JSON 6
M DOM, Werte mit setAttribute in XML schreiben XML & JSON 3
D Tabs/Einrückungen der XML-Elemente gehen beim Schreiben verloren XML & JSON 5
J XML lesen schreiben XML & JSON 7
T Xml lesen und in .txt zeilenweise schreiben XML & JSON 4
L Einfaches XML Lesen und Schreiben XML & JSON 4
O OpenDocument-Tabelle mit Java lesen und schreiben XML & JSON 3
G Wie Attribute aus XML in ein Model schreiben (StAX)? XML & JSON 7
K XML-schreiben aus ResultSet dauert zu lange XML & JSON 10
G Mit JAXP in eine Datei schreiben XML & JSON 2
R XML-Datei schreiben - InstantiationException XML & JSON 2
Z DOM: Attribute in Knoten schreiben XML & JSON 2
S XMl Dateien in Java schreiben XML & JSON 4
iman XML Attribute mit JAVA einlesen mit Spring Batch XML & JSON 0
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
L XML einlesen gleichnamige Elemente XML & JSON 5
T HTML mit Hilfe Jsoup einlesen XML & JSON 11
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
W XML einlesen und Attribute auslesen XML & JSON 1
M XML Werte einlesen aber wie am besten weiterverarbeiten? XML & JSON 13
L XML nur ein Element einlesen XML & JSON 2
L Jackson JSON: Probleme beim einlesen XML & JSON 1
S XML in JTable Einlesen XML & JSON 3
B XML analysieren und einlesen XML & JSON 26
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
Ollek XML Einlesen - Welche API ist die richtige? XML & JSON 14
X XML einlesen XML & JSON 6
C JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben XML & JSON 7
jstei001 .xsd File wärend der Laufzeit einlesen und XMl rausschreiben XML & JSON 5
J XML mit russischem Inhalt einlesen XML & JSON 4
D XML Einlesen mit JaxB XML & JSON 4
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
N xsd pattern in java einlesen XML & JSON 6
F Einlesen von JDBC connection in Java von XML XML & JSON 4
F XML erzeugen aus JTree und wieder einlesen... XML & JSON 6
N JDOM: XML einlesen XML & JSON 4
F XML mit DOM einlesen- Teile in Arraylist speichern XML & JSON 4
S XML einlesen XML & JSON 18
F XML Datei in Java einlesen XML & JSON 4
H XMI über EMF / UML2 einlesen XML & JSON 7
S XML einlesen, analysieren, bearbeiten & als Textdatei ausgeben XML & JSON 1
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
H xml-Datei mit Attributen einlesen XML & JSON 3
C xml "zeilenweise" einlesen XML & JSON 6
S XML-Schema einlesen um parsen zu erleichtern? XML & JSON 2
L Element einlesen <Telefon name="Karl">134313 XML & JSON 2
G XML Tag beim Einlesen manipulieren XML & JSON 2
J XML-Datei ein Array einlesen XML & JSON 10
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
G Simples XML File einlesen mit JDom. Prefix not bound ? XML & JSON 2
M Liste in Baumstruktur einlesen XML & JSON 4
D nicht (ganz) valiedes XML einlesen! XML & JSON 19
S Einlesen einer xml Datei XML & JSON 4
S XML Datei einlesen, aber root überspringen XML & JSON 2
M XML einlesen - prüfen ob Element vorhanden XML & JSON 2
M NullPointerException bei Einlesen XML XML & JSON 3
S XML Strings in JAVA einlesen, aber wie? XML & JSON 8
K JDOM SAXBuilder einlesen XML & JSON 6
G Newbe - Frage.XML - Datei einlesen und speichern XML & JSON 2
G xml einlesen und bestimmte Elemente an eine gui_Klasse überg XML & JSON 25
B XML String einlesen XML & JSON 4
M mit JDOM XML-Datei einlesen, die nicht "well-formed&quo XML & JSON 3
T Newbie Frage. CSS Stylesheet einlesen und suchen nach Tags XML & JSON 6
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
C Zeile herausfinden in der ein Fehler beim Einlesen entsteht XML & JSON 3
R wie kann ich ein xml file in einen string einlesen? XML & JSON 2
N Objekte via XML speichern und wieder einlesen XML & JSON 12
R POST REQUEST: XmlDocument mit getInputStream einlesen! XML & JSON 6
E Wie kann ich ein XSD-Schema in einer JSP-Seite verwenden? XML & JSON 7
B XML Schema Validierung des Zahlenbereichs XML & JSON 3
P Eclipse Rinzo - Schema muss mit DOCTYPE "root" übereinstimmen XML & JSON 0
K XML Schema list unique value restriction XML & JSON 0
F.S.WhiTeY JAXB: Schema nicht "erben" XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben