Kommunikation zwischen einzelnen Programmen mit XML



  • Hallo C++ Community,

    ich schreibe zur Zeit meine Masterarbeit im Bereich der Luft- und Raumfahrttechnik, daher bin ich leider nicht der große Programmierexperte.
    Und zwar möchten wir an meinem Fachbereich als langfristiges Projekt eine Software zur Konzeptentwicklung von Flugzeugen programmieren.
    Diese soll aus einzelnen Tools bestehen (also einzelnen executables), die in C++ programmiert werden. Mit einem Buch habe ich mir dafür C++ beigebracht, das ist auch eher nicht das Problem.
    Die nachfolgenden Tools sollen dabei natürlich von den vorherigen Tools Daten zur weiteren Verarbeitung erhalten.
    Ich hatte dabei an einfache Binärdateien oder Ascii Dateien gedacht.
    Also Tool A schreibt alle relevanten Variablen in eine Datei und Tool B liest die Variablen aus dieser Datei wieder ein. Das wäre auch alles kein Problem.

    Mein betreuender Prof. meinte jetzt allerdings das die Kommunikation zwischen den Tools auch mit XML-Dateien geschehen könnte und da beginnen meine Probleme, da ich mit XML leider 0 Erfahrungen habe und meinen Betreuer auch nicht enttäuschen möchte.
    Habe mir jetzt aus der Bib. erstmal das Buch "Einstieg in XML" besorgt, um überhaupt zu verstehen was ich mit XML machen kann, aber ich glaube in dem Buch wird mein konkretes Problem auch nicht behandelt und ein anderes Buch über XML gibt es in unserer Bib. leider nicht.

    Gibt es Literaturempfehlungen zu diesem Thema, bzw mit was genau muss ich mich in diesem Fall beschäftigen? Hab irgendwas über XML-Parser gelesen, ist es das was ich brauche und welcher ist Empfehlenswert, bzw. ist der Parser für meine Problemstellung überhaupt gedacht?

    Als Entwicklungsumgebung nutze ich Code::Blocks.

    Danke an alle, die meinem Roman gelesen haben.

    Gruß



  • XML ist nichts, was schwer zu verstehen ist, dazu gibt es genug Informationen im Internet. Mit libs wie tinyxml kannst du XML-Daten auch ganz einfach mit C++ einlesen und schreiben, auch dazu gibt es einige Beispiele.
    Im Titel schreibst du Kommunikation zwischen Programmen, dh. du möchtest IPC betreiben. Das ist ein recht umfangreiches Thema, was erstmal nichts mit XML etc zutun hat. Du kannst erwähnen, wie so etwas funktioniert, was das Betriebssystem damit zutun hat, was es für Typen gibt etc. Auch dazu gibt es passende Bibliotheken für C++, einfach mal googeln.



  • Auch wenn das nicht Teil deiner Frage war, kann ich dir da nur die boost Library empfehlen, diese ist mit Memorymapped Fiels verdammt schnell (wenn man es will) und hat auch schon Sychronisationsmechanismen implementiert.

    http://www.boost.org/doc/libs/1_58_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory

    Wenn du nur Einstellungsparameter übertragen möchtest und nicht 2 Laufende Prozesse kommunizieren lassen möchtest, bietet da boost auch eine serilizations Library, welche z.B. mit XML deine Einstellungen speichert und du diese dann auch wieder lädt:
    http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/



  • Ich glaube er meint mit "Kommunikation zwischen den Tools" einfach ne Toolchain, also dass ein Programm File1 frisst und File2 ausspuckt, das nächste Programm File2 frisst und File3 ausspuckt usw.
    Da passt XML schon.

    Davon abgesehen ... wieso soll XML nichts mit IPC zu tun haben? Was ist mit Web-Services? Da verwenden richtig viele XML.



  • hustbaer schrieb:

    Davon abgesehen ... wieso soll XML nichts mit IPC zu tun haben? Was ist mit Web-Services? Da verwenden richtig viele XML.

    Z.B.?

    Muss da nicht bei jeder kleinen Änderung die komplette File geparst werden? Oder zumindest der Node wieder gesucht werden? Ich Erkenne halt darin keinerlei Vorteile.



  • @AlexR
    Musst du grosse Datenmengen verarbeiten/generieren?
    Wenn ja, dann könnte sein dass XML keine sehr gute Wahl ist. Hängt natürlich vom genauen Ausmass von "gross" ab, und auch davon wie aufwendig die Bearbeitung der Daten selbst ist.
    Denn wenn die Bearbeitung ne Stunde braucht, und für XML Parsen/Schreiben nochmal 5 Minuten draufgehen, dann ist das eher weniger wichtig. Wenn die Bearbeitung allerdings bloss 1-2 Minuten braucht, dann tun dir die 5 Minuten für "XML" weh.

    Falls nichts dergleichen dagegen spricht, dann sprechen natürlich viele Dinge für XML. z.B. dass es mehr oder weniger leicht zu lesen ist (für Menschen) und dass es viele fertige Tools gibt mit denen man XML irgendwie "bearbeiten" kann.

    Also z.B. nach bestimmten Regeln transformieren oder "Data-Mining" betreiben.

    Was das Format selbst angeht kann ich Techel zustimmen: XML ist - wenn man nicht alle Features/Feinheiten (schemas, namespaces, user-defined entities etc.) kennen muss - relativ easy und gut im Internet dokumentiert.

    Es gibt allerding auch einfachere Formate die ebenso ziemlich weit verbreitet sind. z.B. JSON.

    Guten und einfach zu verwendenden XML oder JSON Parser für C++ kann ich dir leider keinen empfehlen. In unseren Projekten verwenden wir Xerces-C (OMG! Umständlich!) und Microsofts XmlLite (schnell und eigentlich ganz gut, aber nicht sehr einsteigerfreundlich und auch Windows-only). Und JSON verwenden wir überhaupt nur in .NET Projekten.



  • JulianH schrieb:

    hustbaer schrieb:

    Davon abgesehen ... wieso soll XML nichts mit IPC zu tun haben? Was ist mit Web-Services? Da verwenden richtig viele XML.

    Z.B.?

    Wie, z.B.?
    z.B. alle Web-Services die wir in unserer Firma in den letzten 3-4 Jahren gebastelt haben.

    Guggsdu: http://www.w3schools.com/xml/xml_soap.asp 😉

    JulianH schrieb:

    Muss da nicht bei jeder kleinen Änderung die komplette File geparst werden? Oder zumindest der Node wieder gesucht werden? Ich Erkenne halt darin keinerlei Vorteile.

    Äh. Ja. Muss aber sowieso. Also dort wo man XML für IPC verwendet. Das wird ja nicht über Shared-Memory oder sowas gemacht, sondern über irgendwelche Streams (üblicherweise TCP/IP aber theoretisch auch Named-Pipes, Stdin/Stdout etc.).

    Vielleicht solltest du dich mal darüber schlau machen was es ist was man üblicherweise als Web-Service bezeichnet 😉

    ps: Bzw. man kann natürlich auch schlau sein, und wenn häufig nur kleine Änderungen an grossen Daten gemacht werden auch nur kleine Änderungen übertragen. Also auf Applikationsebene statt eines "ich schicke dir Dokument X neu" ein "ich schicke dir Teil Y aus Dokument X neu, ersetz den bitte in deiner Kopie" machen.



  • Hallo,
    danke schonmal für eure Antworten.
    Also was ich vorhab ist, dass die einzelnen Tools nacheinandern aufgerufen werden, also eine Prozesskette wie schon erwähnt wurde.

    Mal als kleines Beispiel, es gibt ein Tool, welches den Flügel auslegt, dieses soll dann im Abschluss alle Daten die den Flügel beschreiben als XML-Datei ausgeben. (Das Tool erstellt irgendwo eine XML Datei)
    Diese könnte dann zum Beispiel so aussehen:

    <?xml version="1.0" encoding="UTF-8"?>
    <wing>
    	<geometry>
    		<area unit="m^2">120</area>
    		<wingspan unit="m">35</wingspan>
    	</geometry>
    	<aerodynamic>
    		<liftCoefficient>2.5</liftCoefficient>
    	</aerodynamic>
    </wing>
    

    Ist jetzt nur sehr rudimentär, natürlich kommen nachher mehr Daten da raus.

    Im nächsten Schritt wird dann das nächste Tool gestartet, der das Flugzeug zusammenbaut aus den einzelnen Bauteilen.
    Dieses Tool muss dann ja die Daten aus den vorherigen Schritten übernehmen.
    Dazu soll die XML-Datei dann wieder eingelesen werden und die dort aufgeführten Daten in Variablen gespeichert werden, mit denen ich dann weiterarbeiten kann.

    Ich hoffe es ist ersichtlich was ich vorhabe.
    Ich muss wirklich keine komplexen Sachen mit XML machen, aber leider bin ich hierbei irgendwie auf mich gestellt, da mein Betreuer selbst keine Ahnung von C++ oder XML hat.

    Danke schonmal für eure Hilfe.

    Gruß

    Alex



  • boost property tree (hier nicht so beliebt, hab ich das Gefühl) kann auch xml parsen und generieren. Der wandelt das in eine Baumstruktur um. Finde ich persönlich einfach zu benutzen.

    http://www.boost.org/doc/libs/1_60_0/doc/html/property_tree.html
    und
    http://www.boost.org/doc/libs/1_60_0/doc/html/property_tree/parsers.html#property_tree.parsers.xml_parser



  • Auch Vielen Dank für deine Antwort,

    ich habe mir mal das TinyXML runtergeladen, funktioniert auch soweit und scheint für meine Probleme angemessen zu sein.

    Danke

    Gruß


Anmelden zum Antworten