Forum: PC-Programmierung Konversion xml o.ae. zu c-source / snmp-mib


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dergute W. (derguteweka)


Lesenswert?

Mahlzeit,

Ich haett' mal gerne folgendes Problem (geloest):
Gegeben ist ein xml-file, z.b. sowas von dem Kaliber hier:
1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
<root>
3
  <status>
4
    <version>v1.234</version>
5
  </status>
6
  <config>
7
    <rwval1>bla</rwval1>
8
    <rwval2>blupp</rwval2>
9
    <subdir>
10
      <rwval3>blipp</rwval3>
11
    </subdir>
12
  </config>
13
</root>

Und daraus haett' ich gerne "automatisch", also irgendwie per Software 
erstellt:
ein / mehrere c-files mit Dummyfunktionen - also sowas wie z.B.
1
void get_status_version(char * version) {
2
//blafasel
3
}
4
void get_config_rwval1(char * rwval1) {
5
//blafasel
6
}
7
void set_config_rwval1(char * rwval1) {
8
//blafasel
9
}
10
....
11
void get_config_subdir_rwval3(char * rwval3) {
12
//blafasel
13
}

weiterhin entsprechend eine snmp-mib
(und weiterhin vielleicht noch irgendwas fancy, was ich noch nicht 
weiss).

Ich spreche C, div. Assembler und etwas VHDL.
Da scheint mir keine dieser Sprachen dafuer besonders gut geeignet zu 
sein, um aus dem XML die entsprechenden anderen Files zu generieren.
Ich vermute mal, sowas koennte ich mit Perl, Python, xslt oder so 
basteln (wenn ich's koennte ;-) ).
Was fuer ne Sprache empfehlen denn Experten fuer sowas?

Gruss
WK

von N. M. (mani)


Lesenswert?

Die Regel ist also alles unter Status bekommt nur eine GET und die unter 
config beides?
Datentyp immer char*?

In Python bekommst du das mit ein paar Zeilen hin. JSON ist da easy. Für 
XML gibt's da aber auch Libs.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

N. M. schrieb:
> Die Regel ist also alles unter Status bekommt nur eine GET und die
> unter
> config beides?
> Datentyp immer char*?

Erstmal 2x Ja. Ich wollt' das Beispiel jetzt nicht gleich ueberfrachten.
Aber wahrscheinlich werden diverse weitere Regeln im Lauf der Zeit 
zweckmaessig werden.

> In Python bekommst du das mit ein paar Zeilen hin. JSON ist da easy. Für
> XML gibt's da aber auch Libs.

Ob JSON oder XML als "source" waere mir auch erstmal wurscht. Ist bei 
mir alles noch im fruehen Hirnfurz-Stadium. Also ist JSON eher geeignet 
fuer parsing mit Python als XML?

Gruss
WK

von Franko S. (frank_s866)


Lesenswert?

Dergute W. schrieb:
> Was fuer ne Sprache empfehlen denn Experten fuer sowas?
XSLT

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Dergute W. schrieb:
> Also ist JSON eher geeignet fuer parsing mit Python als XML?
Ich meine das JSON von Haus aus mitkommt für komfortables arbeiten mit 
XML sich eine externe Lib empfiehlt.
Bin noch relativ frisch was Python angeht.
Versuche aber immer wieder etwas damit zu spielen.
Man möge mich korrigieren falls es da besseres gibt (bitte mit Angabe 
was).

Ich hab das gerade mal kurz ausprobiert (siehe Anhang).
Macht eigentlich das was du gesagt hast.
Jemand wo sich mit Python auskennt macht das bestimmt eleganter, aber es 
tut.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

N. M. schrieb:
> Ich hab das gerade mal kurz ausprobiert (siehe Anhang).

Sehr schick, merci vielmals!
Dat geht ja sogar fast auf Anhieb (musste bloss gschwind xmltodict 
installieren).
Bin schwer impraegniert :-)

Franko S. schrieb:
> Dergute W. schrieb:
>> Was fuer ne Sprache empfehlen denn Experten fuer sowas?
> XSLT

Koennt ich dich oder wen anderes XSLT-sprechenden erfolgreich um ein 
Stueckchen src anschnorren?

Gruss
WK

von N. M. (mani)


Lesenswert?

Dergute W. schrieb:
> Sehr schick, merci vielmals!

Kein Problem. War nicht viel Arbeit.

Dergute W. schrieb:
> musste bloss gschwind xmltodict installieren

Ja das ist das was ich meinte :-)
JSON kommt glaube ich so mit.

Dergute W. schrieb:
> Bin schwer impraegniert :-)

Ist bei dem Wetter nicht verkehrt.

von Franko S. (frank_s866)


Lesenswert?

Dergute W. schrieb:
> Koennt ich dich oder wen anderes XSLT-sprechenden erfolgreich um ein
> Stueckchen src anschnorren?

nein, ist aufwendiger als json. Lohnt sich nur wenn man "komplexere" 
Strukturen hat. Der Vorteil ist halt dass man xml als Quelle hat dieses 
verfizieren kann, dazu musst du aber noch ein Schema oder dtd 
definieren.
Das lohnt sich aber erst ab einer gewissen "Kompliziertheit" deiner 
xml-Struktur und irgendwie ist xml eh pain in the ass.

Oder man baut sich ne DSL, z.B. mit ANTLR oder nimmt groovy da kann man 
sehr Elegant in der Sprache selber rumwerkeln. gradle ist ein bsp. wie 
das so gemacht wurde aber die gehen afaik inzw. auch weg von diesem 
Ansatz.
Lohnt aber auch erst ab einer gewissen Komplexität und wenn man da was 
"dauerhaftes" baut das man evt. ausbauen will, ausser man hat sowas 
schon mal gemacht und kennt groovy gut genug dann ist das sehr easy und 
elegant, imo.

Aber bleib besser erst mal bei json wenn das reicht.

von Michi S. (mista_s)


Lesenswert?

Dergute W. schrieb:
> Gegeben ist ein xml-file, z.b. sowas von dem Kaliber hier:

Das ist aber eher maximal keinkalibrig.

Dergute W. schrieb:
> weiterhin vielleicht noch irgendwas fancy, was ich noch nicht
> weiss

Weißt Du überhaupt schon, welches Problem Du zu lösen beabsichtigst oder 
bist noch mitten im Problem(er)findungs-Brainstorming?


> Ich spreche C, div. Assembler und etwas VHDL.
> Da scheint mir keine dieser Sprachen dafuer besonders
> gut geeignet zu sein, um aus dem XML die entsprechenden
> anderen Files zu generieren.

Da hast Du sicherlich recht, allerdings gibts wohl zumindest für/in C 
libs zum XML-Parsen wie Sand am Meer; solange also die Komplexität in 
der Größenordnung Deines Beispiels bleibt, sollte das größte Problem 
dabei die Auswahl der passendsten XML-lib sein.


> Ich vermute mal, sowas koennte ich mit Perl, Python,
> xslt oder so basteln (wenn ich's koennte ;-) ).
> Was fuer ne Sprache empfehlen denn Experten fuer sowas?

XSLT wurde genau dafür erfunden; insofern liegst Du da sicher richtig. 
Perl, Python usw. sind ähnlich wie C einfach allgemeine 
Programmiersprachen in denen sich eigentlich eh fast alles machen läßt.


Dergute W. schrieb:
> Koennt ich dich oder wen anderes XSLT-sprechenden
> erfolgreich um ein Stueckchen src anschnorren?

Sorry, bin da über ein rudimentäres Radebrechen nie wirklich 
rausgekommen und auch das ist bald 1/4 Jahrhundert her; was mir noch in 
Erinnerung ist, war die Grundidee aber genau das was Du suchst, aus ein 
und derselben XML-Quelldatei je nach Bedarf z.B. eine HTML, PDF, PS, 
etc. Repräsentation zu erzeugen. Aber so wirklich Sinn macht das ganze 
halt erst bei deutlich komplexeren Aufgabenstellungen als in Deinem 
Beispiel.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Franko S. schrieb:
> Lohnt sich nur wenn man "komplexere"
> Strukturen hat.

Franko S. schrieb:
> Das lohnt sich aber erst ab einer gewissen "Kompliziertheit" deiner
> xml-Struktur

Jaaaaa...
Nun ist es aber auch so, dass es ja (nicht nur) hier nicht so 
wohlgelitten ist, wenn man eine komplette Software mit z.b. 100000LOC 
hier anpappt und fragt, warum dann malloc() in Zeile 4242 des Programms 
nach einer Weile nicht mehr geht.

Warum sollte ein Beispiel unnoetig komplex und aufgeblasen sein, wenn's 
auch in simpler geht, die Problematik zu erklaeren?
Koennte natuerlich auch sein, dass ich zu doof bin zu erkennen, dass 
fuer eine Handvoll Funktionen sich so ein Aufriss nicht lohnt.
Nee - ist aber nicht so.

Michi S. schrieb:
> Perl, Python usw. sind ähnlich wie C einfach allgemeine
> Programmiersprachen in denen sich eigentlich eh fast alles machen läßt.

Ja, so wie ich mir auch meine Hose mit einer Beisszange anziehen kann 
oder mit einem Buegeleisen eine Scheibe Leberkaes' braten. Geht auch 
alles, weil das universelle Werkzeuge sind...

An dieser Stelle: Danke nochmal fuer das Pythonbeispiel.

Gruss
WK

von Johnny B. (johnnyb)


Lesenswert?

Dergute W. schrieb:
> Was fuer ne Sprache empfehlen denn Experten fuer sowas?

Sowas am besten gar nicht selber programmieren, sondern von einer KI 
machen lassen.

von Le X. (lex_91)


Lesenswert?

Ich nutze ein paar Zeilen Python-Code um größere Mengen C-Code aus 
Excel-Dateien zu generieren.
Aber natürlich kann man auch .xml als Input nutzen, ist sogar einfacher.

XSLT wurde auh schon genannt, aber das ist für dein simples Problem eher 
aufwendig.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Johnny B. schrieb:
> Dergute W. schrieb:
>> Was fuer ne Sprache empfehlen denn Experten fuer sowas?
>
> Sowas am besten gar nicht selber programmieren, sondern von einer KI
> machen lassen.

Fuer die Einen ist es Selbstverstaendlich, fuer Andere die duennste 
Salamischeibe der Welt: Ich moechte das mit moeglichst wenig Aufriss, 
aus einem Makefile heraus machen. Und ich moechte mir nicht 
Multi-Gigabyte von Bloat oder gar Internetzugang als Abhaengigkeit fuer 
so einen Quark einfangen.

Gruss
WK

von Rolf (rolf22)


Lesenswert?

Michi S. schrieb:
> allerdings gibts wohl zumindest für/in C libs zum XML-Parsen wie Sand am
> Meer; solange also die Komplexität in der Größenordnung Deines Beispiels
> bleibt, sollte das größte Problem dabei die Auswahl der passendsten XML-lib
> sein.

Es gibt auch sehr komfortable .NET-Bibliotheken dafür. Nicht nur zum 
Parsen, sondern auch zum Generieren und Modifizieren von XML-Dateien.
C# lernt man als C-Programmierer ruckzuck, und wenn man erstmal gemerkt 
hat, wie bequem es ist, wenn man nicht überlegen muss, wann man was wo 
in den Heap schreibt und wo welcher Pointer hinzeigt, will man gar nicht 
mehr von C# weg.

Klar, C# frisst Speicher und Rechenzeit und läuft nur auf einem PC 
(nicht auf einem µP), aber das spielt vermutlich hier gar keine Rolle.

von Franko S. (frank_s866)


Lesenswert?

Rolf schrieb:
> Es gibt auch sehr komfortable .NET-Bibliotheken dafür. Nicht nur zum
> Parsen, sondern auch zum Generieren und Modifizieren von XML-Dateien.
Es gibt sogar Tools die das ganz ohne eine explizite Sprache können.
Das ruft man dann in einem bashscript auf und muss sich nicht mal mit C# 
rumplagen.

von Vanye R. (vanye_rijan)


Lesenswert?

> Ich spreche C, div. Assembler und etwas VHDL.

Dann solltest du flex/bison lernen weil dir das jeden
gewuenschten Parser automatisch generiert.

Vanye

von Oliver (imonbln)


Angehängte Dateien:

Lesenswert?

N. M. schrieb:
> Jemand wo sich mit Python auskennt macht das bestimmt eleganter, aber es
> tut.

Ich habe mir mal die Freiheit genommen dein Python Programm etwas 
anzupassen. Da du schreibst das du Python Anfänger bist, dachte ich das 
es vielleicht hilfreich ist.

1.) du solltest unterhalb von "if _name_ == '__main__':" nur eine main 
Funktion rufen und keinen Code schreiben, das ist eine Konvention unter 
Python Entwicklern, hauptsächlich weil du sonst den Code nicht testen 
kannst.

2.) trav_Dict sollte keine Funktion, sondern ein Generator sein, das 
spart Arbeitsspeicher. Außerdem gibt es in Python die Konvention, dass 
Funktionen/Methoden nicht im Camelcase geschrieben werden, sondern durch 
ein underline trennen du hast beides gemacht. Solltest du bei trav_Dict 
auf dem Rückgabewert Liste bestehen, würde ich dir raten die listen mit 
extend und nicht mit Plus zu verketteten. Variablen werden übrings auch 
immer, in Python komplett kleingeschrieben.

3.) das du in der Main erst teste, ob das XML existiert, ist eher 
unüblich bei Python Entwicklern. Python ist Stolz drauf das Exceptions 
leichtgewichtig sind, daher hat sich bei Python das "It is easier to ask 
forgiveness than it is to get permission" – Prinzip durchgesetzt und man 
verucht einfach die Datei zu öffnen, Wenn nicht gibt es halt eine 
Exception, welche man aufräumen kann.

4.) das os.path Module wird als veraltete angesehen und sollte, wo immer 
möglich durch ein Path Objekt aus der Pathlib ersetzt werden.

5.) Variablen Namen sollten sprechend sein, die Namen obj oder d sind es 
nicht. Generell empfehle ich dir Variablen zu verwenden, welche 
mindestens 3 Zeichen enthalten, ansonsten ist es Krampf die zu suchen 
und ersetzen. Generell gilt das jedes Programm öfter gelesen als 
Geschieben wird, daher sollte man auf Lesbarkeit optimieren. Sprechende 
variable Namen sind da ein einfaches Mittel, das Verständnis zu fördern.

6.) Fehlermeldungen solltest du nach sys.stderr schreiben und nicht nach 
sys.stdout, das kannst du erreichen, indem du beim print den 
File-Parameter angibst.

7.) das Suchen nach "status" und "config" ist defacto so ähnlich, dass 
es sich lohnt hierfür eine Funktion zu schreiben, um das dry-Prinzip 
einzuhalten.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Merci auch fuer das 2. Pythonprogramm. Sieht fuer mich als Laien etwas 
C++iger aus als das erste (wahrscheinlich weil "try"  drinnen vorkommt) 
:-)
Aber soweit ist schon klar: Meinereiner schaut aeusserst interessiert in 
das Uhrwerk (oink oink).

Bei flex/Bison frag' ich mich, ob die nicht dann gut waeren, wenn es 
noch keine Parser fuer xml geben wuerde. Da es die aber gibt, haette ich 
jetzt erstmal nicht aufm Schirm gehabt.

Gruss
WK

von N. M. (mani)


Lesenswert?

Oliver schrieb:
> Ich habe mir mal die Freiheit genommen dein Python Programm etwas
> anzupassen. Da du schreibst das du Python Anfänger bist, dachte ich das
> es vielleicht hilfreich ist.

Super. Vielen Dank. Ich versuche das Mal nachzuvollziehen.
In manche Dinge wie Konventionen, Verwendung von alten Bibliotheken usw. 
muss man halt nach und nach hinein wachsen. Gerade Schreibweise und 
Länge von Variablen- und Funktionsnamen ist selbst innerhalb einer 
Sprache eine Religionssache :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.