ERLEDIGT
NEIN
NEIN
ANTWORTEN
21
21
ZUGRIFFE
1370
1370
EMPFEHLEN
-
10.04.07 09:01 #1
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
ich befinde mich zur Zeit in einem Praktikum und muss ein Programm mit unter anderem folgenden Anforderungen entwickeln:
- Das Programm muss den Inhalt eines XML Dokuments in C-Code übersetzen. Die Regeln für die Übersetzung sind in einem XSL Dokument enthalten. Das Programm soll also ein C-Dokument mit dem entsprechenden C-Code erzeugen.
- Das Programm muss prüfen können, ob das XML Dokument gültig ist.
- Das Programm muss prüfen können, ob das XML Dokument über ein Stylesheet verfügt.
- ...
Ich habe etwas recherchiert. Mein aktueller Stand ist, dass ich zur Umsetzung der Anforderungen die API dom4j benutzen würde. Ist diese API zur Lösung meiner Aufgabenstellung geeignet oder würdet ihr eine andere API bzw. eine andere Herangehensweise empfehlen ?
Gruß
Tikonteroga
-
Hallo,
nur damit ich das richtig verstehe, du hast ein xml-File und daraus soll nachher eine c-File entstehen mit allen vorbelegten Variablen und so?
Mit welcher Sprache soll es denn umgesetzt werden, auch in c? Denn dom4j ist ja für Java. Falls es egal ist könntest du dir nocht JDom anschauen.
MFG
zEriX
-
10.04.07 09:23 #3
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
bei dem C-Code handelt es sich hauptsächlich um Strukturen -> struct name { ... } ;
Der Parser soll in JAVA implementiert sein.
Gibt es denn bedeutende Unterschiede zwischen Dom4J und JDom ?
Gruß
Tikonteroga
-
10.04.07 10:37 #4
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
ich habe mir jetzt mal verschiedene APIs angeschaut. Die Menge an Klassen und Methoden hat mic ganz schön erschlagen.
Gibt es eigentlich Methoden, denen ich eine XML-Datei als Source übergeben kann und die mir dann anhand des Stylesheets, dass in der XML-Datei angegeben den XML-Code in den Zielcode übersetzt und zurückgibt? Den Zielcode könnte ich dann in einer Datei speichern ...
Gruß
Tikonteroga
-
Ich weiß nur, dass es mit externen XSLT-File funktioniert.
-
10.04.07 11:32 #6
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
also ein XSL-Dokument mit entsprechenden Templates zu erstellen ist nicht mein Problem (zumindest glaube ich das). Ich habe gerade Schwierigkeiten damit, wie ich eine XML-Datei gemäß den Templates in der XSL Datei in den von mir gewünschten C-Zielcode transformieren kann. Ich habe bis jetzt noch keine Klassen/Methoden finden können, die mir den von mir gewünschten Zielcode erstellen.
Ich habe mir den Ablauf so vorgestellt:
[ XML-Datei ] -------> ( XML-Parser ) -------> ( XSL-Prozessor ) -------> [ C-Datei ]
Dabei prüft der XML-Parser ob das XML-Dokument gültig ist und gibt es ggt. an den XSL-Prozessor weiter. Dieser transformiert den XML-Code dann nach den Templates in der XSL-Datei (Stylesheet) in den C-Code, den ich dann in einer Datei speichere. Macht das so sinn ?
Gruß
Tikonteroga
-
Das wäre mal eine Möglichkeit mit dem DOM-Parser der schon im JDK enthalten ist.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
import java.io.File; import java.io.FileOutputStream; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.w3c.dom.Document; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class SimpleTransform { static boolean valid = true; public static void main(String[] args) throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(new File("test.xsd")); factory.setSchema(schema); DocumentBuilder parser = factory.newDocumentBuilder(); parser.setErrorHandler(new ErrorHandler(){ public void error(SAXParseException arg0) throws SAXException { valid = false; } public void fatalError(SAXParseException arg0) throws SAXException { valid = false; } public void warning(SAXParseException arg0) throws SAXException { valid = false; } }); Document document = parser.parse("test.xml"); TransformerFactory factoryT = TransformerFactory.newInstance(); Transformer transformer = factoryT.newTransformer(); if(valid) transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("test.c"))); else System.out.println("Not valid"); } }
Es gibt bestimmt bessere Varianten, aber das ist mal eine Möglichkeit.
MFG
zEriX
-
10.04.07 15:27 #8
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
vielen Dank für das Code-Beispiel. Bin gerade dabei den Code zu analysieren und versuche ihn zu verstehen.
Ich hätte noch eine Frage. Ich habe nicht geplant etwas mit XSD zu machen. Geht es auch ohne ?
Gruß
Tikonteroga
-
Wenn du statt
Code :1 2
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(new File("test.xsd")); factory.setSchema(schema);
schreibst, wird es auf ein dtd validiert.Code :1
factory.setValidating(true);
Wenn du keine Validierung möchtest, lässt du beides weg.
MFG
zEriX
-
11.04.07 13:01 #10
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
vielen Danke für die Hilfe und die Code-Beispiele.
Ich habe mir jetzt mal versucht einen einfachen Prototypen zu erstellen, um den Ablauf zu testen. Dazu habe ich eine XML-, eine DTD- und eine XSL-Datei erstellt. Wenn ich aber jetzt den JAVA Code ablaufen lasse, wird nur der XML Code geparsed und in die Zieldatei geschrieben. Er wird jedoch nicht gemäß den Templates in meiner XSL-Datei transformiert Wo könnte bei mir denn der Fehler liegen ?
XML-Datei
Code :1 2 3 4 5 6 7 8 9 10 11 12
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <?xml-stylesheet type="text/xsl" href="style.xsl"?> <!DOCTYPE parent SYSTEM "patterns.dtd"> <parent> <child1>child1</child1> <child2>child2</child2> <child3>child3</child3> </parent>
DTD-Datei
Code :1 2 3 4 5
<!ELEMENT parent (child1, child2, child3)> <!ELEMENT child1 (#PCDATA)> <!ELEMENT child2 (#PCDATA)> <!ELEMENT child3 (#PCDATA)>
XSL-Datei
Code :1 2 3 4 5 6 7 8 9
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="fehler"> Test </xsl:template> </xsl:stylesheet>
Ich probiere weiter den Fehler zu finden, würde mich freuen, wenn mir jemand einen Tipp geben könnte.
Gruß
Tikonteroga
-
Bei einer XSLT-Datei werden alle elemente in der XML-Datei angelaufen. Existiert ein Template für ein Element, wird es gemäß diesem Template in die Zieldatei geschrieben, existiert kein Template, dann wird einfach es einfach so in die Zieldatei geschrieben.
Bei dir heißt das Template "fehler", aber es gibt kein Element mit diesem Namen, deshalb wird dieses Template ignoriert. Da es aber für die anderen Elemente keine Templates gibt werden diese einfach so in die Zieldatei geschrieben.
MFG
zEriX
-
11.04.07 13:41 #12
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
ich habe jetzt den Fehler in der XSL-Datei korrigiert. Aber das Verhalten hat sich nicht geändert. Es wird weiterhin nicht transformiert.
XSL-Datei
Code :1 2 3 4 5 6 7 8 9 10
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="parent">Test</xsl:template> <xsl:template match="child1">1</xsl:template> <xsl:template match="child2">2</xsl:template> <xsl:template match="child3">3</xsl:template> </xsl:stylesheet>
Zieldatei:
Code :1 2 3 4 5 6 7
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="style.xsl"?> <parent> <child1>child1</child1> <child2>child2</child2> <child3>child3</child3> </parent>
Gruß
Tikonteroga
-
Also ich musste noch
bei dem Template für parent schreiben, aber sonst funktioniert es.Code :1
<xsl:apply-templates/>
XML
Code :1 2 3 4 5 6
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="style.xsl"?> <parent> <child1>child1</child1> <child2>child2</child2> <child3>child3</child3> </parent>
XSLT
Code :1 2 3 4 5 6 7 8 9
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="parent">Test<xsl:apply-templates/></xsl:template> <xsl:template match="child1">1</xsl:template> <xsl:template match="child2">2</xsl:template> <xsl:template match="child3">3</xsl:template> </xsl:stylesheet>
Java
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
package org.bundeswehr.transform; import java.io.File; import java.io.FileOutputStream; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.w3c.dom.Document; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class SimpleTransform { static boolean valid = true; public static void main(String[] args) throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = factory.newDocumentBuilder(); Document document = parser.parse("test.xml"); TransformerFactory factoryT = TransformerFactory.newInstance(); Transformer transformer = factoryT.newTransformer(new StreamSource(new File("test.xslt"))); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("test.txt"))); } }
MFG
zEriX
-
11.04.07 15:20 #14
- Registriert seit
- Apr 2007
- Beiträge
- 153
Hallo,
könntest du mal den inhalt deiner test.txt posten ?
Gruß
Tikonteroga
-
Das ist der Inhalt der txt.
Code :1 2 3 4
<?xml version="1.0" encoding="UTF-8"?>Test 1 2 3
Dasist klar. Der xsl:output ist hier standardmäßig auf xml eingestellt, wenn man das umstellt auf Text kommt das nicht mehr.Code :1
<?xml version="1.0" encoding="UTF-8"?>
Code :1
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
Ähnliche Themen
-
VB6-code in VB.net übersetzen?
Von anulika im Forum .NET CaféAntworten: 3Letzter Beitrag: 09.07.08, 10:26 -
Übersetzen
Von deforation im Forum Cinema 4DAntworten: 3Letzter Beitrag: 23.06.06, 19:47 -
Sonderzeichen übersetzen
Von FAD im Forum Flash PlattformAntworten: 6Letzter Beitrag: 06.01.06, 13:02 -
Wie würdet Ihr das übersetzen? de - en
Von redlama im Forum SmalltalkAntworten: 23Letzter Beitrag: 05.04.05, 04:21 -
übersetzen
Von anakari im Forum PHPAntworten: 6Letzter Beitrag: 28.03.02, 00:25





Zitieren

Login





