XML in C übersetzen

Tikonteroga

Erfahrenes Mitglied
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
 
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
 
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
 
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:
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
 
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:
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(new File("test.xsd"));
		factory.setSchema(schema);

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

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

MFG
zEriX
 
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:
<?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:
<!ELEMENT parent (child1, child2, child3)>
<!ELEMENT child1 (#PCDATA)>
<!ELEMENT child2 (#PCDATA)>
<!ELEMENT child3 (#PCDATA)>

XSL-Datei

Code:
<?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
 
Zurück