tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
21
ZUGRIFFE
1370
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    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
     

  2. #2
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     

  3. #3
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    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
     

  4. #4
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    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
     

  5. #5
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Ich weiß nur, dass es mit externen XSLT-File funktioniert.
     

  6. #6
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    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
     

  7. #7
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     

  8. #8
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    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
     

  9. #9
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Wenn du statt
    Code :
    1
    2
    
    Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(new File("test.xsd"));
            factory.setSchema(schema);

    Code :
    1
    
    factory.setValidating(true);
    schreibst, wird es auf ein dtd validiert.

    Wenn du keine Validierung möchtest, lässt du beides weg.

    MFG
    zEriX
     

  10. #10
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    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
     

  11. #11
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     

  12. #12
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    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
     

  13. #13
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Also ich musste noch
    Code :
    1
    
    <xsl:apply-templates/>
    bei dem Template für parent schreiben, aber sonst funktioniert es.

    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
     

  14. #14
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    könntest du mal den inhalt deiner test.txt posten ?

    Gruß

    Tikonteroga
     

  15. #15
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Das ist der Inhalt der txt.
    Code :
    1
    2
    3
    4
    
    <?xml version="1.0" encoding="UTF-8"?>Test
        1
        2
        3

    Das
    Code :
    1
    
    <?xml version="1.0" encoding="UTF-8"?>
    ist klar. Der xsl:output ist hier standardmäßig auf xml eingestellt, wenn man das umstellt auf Text kommt das nicht mehr.

    Code :
    1
    
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
     

Ähnliche Themen

  1. VB6-code in VB.net übersetzen?
    Von anulika im Forum .NET Café
    Antworten: 3
    Letzter Beitrag: 09.07.08, 10:26
  2. Übersetzen
    Von deforation im Forum Cinema 4D
    Antworten: 3
    Letzter Beitrag: 23.06.06, 19:47
  3. Sonderzeichen übersetzen
    Von FAD im Forum Flash Plattform
    Antworten: 6
    Letzter Beitrag: 06.01.06, 13:02
  4. Wie würdet Ihr das übersetzen? de - en
    Von redlama im Forum Smalltalk
    Antworten: 23
    Letzter Beitrag: 05.04.05, 04:21
  5. übersetzen
    Von anakari im Forum PHP
    Antworten: 6
    Letzter Beitrag: 28.03.02, 00:25