(Gelöst) xml file lesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
florit
Beiträge: 59
Registriert: 10.01.2022 12:24:50
Lizenz eigener Beiträge: MIT Lizenz

(Gelöst) xml file lesen

Beitrag von florit » 19.01.2023 14:17:59

hallo ...

ich habe eine Funktion die mir ein xml file einlesen sollte ... dummer weise gibt es mir null zurück.
hier das xml file:

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>
<um-configuration version="1.0">
  <xmlb>
    <xmlb name="B">A</xmlb>
    <xmlb name="C">R</xmlb>
  </xmlb>
</um-configuration>
und hier die Funktion in c

Code: Alles auswählen

void config(char *hugh) {
    char         *docname;
    xmlDocPtr    doc;
    xmlNodePtr   cur;
    xmlChar      *uri;
    char *config[2][1] = { {"B","C"} };
    int count = 0;
    int count1 = 0;
    
    docname = hugh;
    doc = xmlParseFile(docname);
    cur = xmlDocGetRootElement(doc);
    cur = cur->xmlChildrenNode;
    
    for (cur = (cur) ? cur->xmlChildrenNode: NULL; cur; cur = cur->next) {
        if (!xmlStrcmp(cur->name, (const xmlChar *) "xmlb")) {
            if((uri =  xmlGetProp(cur,(xmlChar *)config[count++])) != NULL) {
                strlcpy(string[count1++][1], (char *)uri,1);
            }
        }
    }
    count = 0;
    count1 = 0;
    xmlFreeDoc(doc);
}
und der string ist global (vorerst)

was mache ich falsch?
Zuletzt geändert von florit am 24.01.2023 19:35:16, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: xml file lesen

Beitrag von Meillo » 19.01.2023 14:39:32

florit hat geschrieben: ↑ zum Beitrag ↑
19.01.2023 14:17:59

Code: Alles auswählen

    doc = xmlParseFile(docname);
    cur = xmlDocGetRootElement(doc);
    cur = cur->xmlChildrenNode;
    
    for (cur = (cur) ? cur->xmlChildrenNode: NULL; cur; cur = cur->next) {
Auf den ersten Blick:

Das ternary-Konstrukt im ersten Teil der for-Schleife wirkt komisch auf mich. Warum setzt du das nicht mit einem if vor der Schleife um, sondern fummelst es so komisch rein? Dadurch wird alles unuebersichtlicher. Und ich vermute, dass dort auch der Fehler liegen koennte.

Tipps, solche Fehler zu debuggen:

- Verwende separate Variablen, statt `cur' immer wiederzuverwenden, dann findest du Fehler schneller.

- Lass dir die Namen der Elemente ausgeben, damit zu weisst, wo du bist.

- Verwende in deiner Input-XML Elemente unterschiedlichen Namens. Alles wird schwieriger, wenn das umgebende Element gleich heisst wie seine Kinder.

- Schreibe moeglichst sauberen Code mit Fehlerbehandlung, in dem jede Aktion separat passiert. (Du weisst hier z.B. nicht, ob im ersten Abschnitt der for-Schleife schon `cur' NULL ist oder ob `cur->xmlChildrenNode' NULL ist.) Pruefe nach jedem Schritt auf NULL und gib ggf. eine Meldung aus, damit du sicherstellen kannst, wo genau das Problem auftaucht.

Wenn du diese Tipps beruecksichtigst, findest du den Fehler vermutlich selber. ;-)
Use ed once in a while!

Benutzeravatar
florit
Beiträge: 59
Registriert: 10.01.2022 12:24:50
Lizenz eigener Beiträge: MIT Lizenz

Re: xml file lesen

Beitrag von florit » 19.01.2023 18:54:32

hallo und danke für die Antwort!

habe ein snippet gefunden welches mir die Sache ausgeben tut.

snippet:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

int main(int argc, char **argv) {

  char         *docname;
  xmlDocPtr    doc;
  xmlNodePtr   cur;
  xmlChar      *uri;
    char *config[2][1] = { {"B", "C"} };
    int count = 0;
    
    if (argc <= 1) {
    printf("Usage: %s docname\n", argv[0]);
    return(0);
  }

  docname = argv[1];

  doc = xmlParseFile(docname);
  cur = xmlDocGetRootElement(doc);

  cur = cur->xmlChildrenNode;
  while (cur != NULL) {
      if (xmlStrcmp(cur->name, (const xmlChar *) config[count++])) {
          printf("node type: Element, name: %s\n",cur->name);
          uri =  xmlGetProp(cur,(xmlChar *)config[count]);
          printf("node type: Element, wert: %s\n", uri);
          xmlFree(uri);
      }
      cur = cur->next;
  }
  xmlFreeDoc(doc);
  return 0;
}


xml file:

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>
<config>
    <refb name="B">R</refb>
    <refc name="C">L</refc>
</config>
ausgabe:

Code: Alles auswählen

node type: Element, name: text
node type: Element, wert: (null)
node type: Element, name: refb
node type: Element, wert: (null)
node type: Element, name: text
node type: Element, wert: (null)
node type: Element, name: refc
node type: Element, wert: (null)
node type: Element, name: text
node type: Element, wert: (null)
bin leider noch nicht viel schlauer geworden warum da null zurück gegeben wird.
liegt es vielleicht an dem xml file?

gruß florit

Benutzeravatar
oln
Beiträge: 483
Registriert: 05.01.2021 09:41:24

Re: xml file lesen

Beitrag von oln » 19.01.2023 19:46:28

Probier mal folgendes.

Code: Alles auswählen

document = xmlReadFile(filename, NULL, 0);
  root = xmlDocGetRootElement(document);
  fprintf(stdout, "Root is <%s> (%i)\n", root->name, root->type);
  first_child = root->children;
  for (node = first_child; node; node = node->next) {
     fprintf(stdout, "\t Child is <%s> (%i)\n", node->name, node->type);
  }
Gruß Ole
AbuseIPDB

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: xml file lesen

Beitrag von Meillo » 19.01.2023 19:57:12

Der Hinweis mit `type' ist gut. Du wirst das mit den passenden Defines vergleichen muessen, damit du nur die gewuenschten Nodes behandelst.

Was `xmlGetProp()' angeht, scheint mir dein Fehler zu sein, dass du nach dem *Inhalt* des Attributes suchst und nicht nach dessen *Namen*. Es muesste so heissen:

Code: Alles auswählen

uri =  xmlGetProp(cur, (xmlChar *)"name");
Ich habe den Eindruck, dass es recht viel Doku zu libxml2 gibt. Am besten, du liest nochmal nach, wie die Datenstrukturen aufgebaut sind und schaust dir nochmal ein paar Beispiele im Internet an.
Use ed once in a while!

Benutzeravatar
florit
Beiträge: 59
Registriert: 10.01.2022 12:24:50
Lizenz eigener Beiträge: MIT Lizenz

Re: xml file lesen

Beitrag von florit » 20.01.2023 23:40:05

danke klappt @Meillo

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: xml file lesen

Beitrag von Meillo » 21.01.2023 09:04:11

:THX:


Es ist ueblich, geloeste Themen zu markieren, indem du deinen Startpost bearbeitest und beim Titel vorne ein ``[geloest]'' ergaenzt.
Use ed once in a while!

Antworten