Forum: PC-Programmierung integerzahl vom node in einer xml bekommen


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 fassel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine xml, wo ein node eine Zahl enthält

<person personID="0">
  <state>0</state>
</person>

der state ist immer eine Zahl. Aber ich bekomme es nur als string raus
if (0 == (xmlStrcmp(cur_node->name, (const xmlChar *)"state")))
                    {
                        state = xmlNodeGetContent(cur_node);
                        printf("%s ", state);
                        xmlFree(state);
                    }
Wie bekomme ich aber die Zahl als integer?
Das ganze mache ich in c mit libxml2.
atoi habe ich leider nicht.

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
atoi
strtol
strtoll
mpz_init_set_str
...

von Stephan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
fassel schrieb:
> atoi habe ich leider nicht.

Wenn Dein Compiler wirklich kein atoi haben sollte: baue es Dir einfach 
selbst. Sourcen von atoi() gibs im netz.
VG

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ungetestet:
int my_atoi(const char* s){
  bool negative = false;
  int result = 0;
  for(; *s && isspace(*s); s++); // If there is no isspace(), you could use *s == ' ' instead
  if(*s == '+'){
    s++;
  }else if(*s == '-'){
    negative = true;
    s++;
  }
  for(; *s >= '0' && *s <= '9'; s++){
    result *= 10;
    result += (*s) - '0';
  }
  if(negative)
    result = -result;
  return result;
}

von fassel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stephan schrieb:
> baue es Dir einfach
> selbst

das wollte ich eigentlich umgehen. Habe gedacht, dass es irgendwie 
möglich ist, die werte direkt als zahl und nicht als string zu 
speichern. Aber dann muss ich da wohl durch.
Hätte aber direkt noch eine Frage
                    if (0 == (xmlStrcmp(cur_node->name, (const xmlChar *)"state")))
                    {
//                        xmlNodeSetContent(cur_node->content, nameValue);
                        xmlNodeSetContent(cur_node, nameValue);
                        ret = 1;
                        break;
                    }

jetzt möchte ich den wert ändern.
Den node an für sich finde ich, aber 'xmlNodeSetContent' ändert nicht 
den Wert. nameValue ist auch ein xmlChar. welchen ich mit spintf von 
einem uint8_t erzeugt habe

von seere (Gast)


Bewertung
0 lesenswert
nicht lesenswert
fassel schrieb:
> atoi habe ich leider nicht.

Das verstehe ich nicht. Du hast libxml2, programmierst in C und hast 
kein atoi? Aus welcher Plattform ist das? atoi ist doch "schon immer" 
(C89/C99/...) im Standard enthalten?

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
fassel schrieb:
> das wollte ich eigentlich umgehen. Habe gedacht, dass es irgendwie
> möglich ist, die werte direkt als zahl und nicht als string zu
> speichern. Aber dann muss ich da wohl durch.

Was meinst du mit "direkt als Zahl"? Der Wert ist direkt als String 
vorhanden. Wenn du den als Zahl willst, muss er erst irgendwie in eine 
solche konvertiert werden. Dazu nimmt man in C z.B. strtol. Von atoi 
würde ich eher abraten, da es keine Möglichkeit vorsieht, einen Fehler 
zu erkennen. Wenn im String keine Zahl steht, sondern z.B. "Hallo", wird 
einfach stillschweigend 0 zurückgeliefert.

seere schrieb:
> fassel schrieb:
>> atoi habe ich leider nicht.
>
> Das verstehe ich nicht. Du hast libxml2, programmierst in C und hast
> kein atoi?

Verstehe ich auch nicht so ganz. Er benutzt auch printf(). Vielleicht 
ist ja dann wenigsten sscanf() vorhanden. Damit könnte man das zur Not 
auch machen.

von imonbln (Gast)


Bewertung
0 lesenswert
nicht lesenswert
fassel schrieb:
> atoi habe ich leider nicht.

atoi ist in der stdlib.h das ist mindestens seit iso9899:1989 so. Wenn 
du das nicht hast, ist dein Compiler kaputt und sollte dringend 
ausgetauscht werden.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
imonbln schrieb:
> iso9899:1989

Das gibt es nicht. Du meinst ISO/IEC 9899:1990 oder ANSI X3.159-1989, 
die beide praktisch den selben Inhalt haben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.