Probleme mit libxml2 c++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit libxml2 c++

    Hallo,
    ich arbeite nun seit kurzem an einem Projekt welches XML nutzt. Genauer benutze ich C++ mit libxml2. Nun habe ich ein XML-File welches nach gewünschten vorgaben durchlaufen und verändert wird. Die Veränderungen sollen nun gespeichert werden und dort tritt ein Problem auf!

    `xmlSaveFormatFile' undeclared (first use this function)

    Mag sein das ich mich täusche aber xmlSaveFormatFile() sollte doch eine funktion der libxml sein?!

    Noch ein kleiner Nachtrag...

    Funktionen wie xmlNewTextChild() funktionieren einwandfrei! D.h. die lib ist richtig eingebunden nehme ich an.

    Vielen Dank für eure Hilfe
  • Ein Crossposter ;)

    Kannst du mir mal die tree.h / den relevanten Ausschnitt posten ich hab das pakt hier nicht? gemeinsam mit deinem Code und der genauen Fehlermeldung

    EDIT:// Ich hab mal ein bisschen Code herüberkopiert:

    Quellcode

    1. int
    2. main(int argc, char **argv) {
    3. char *docname;
    4. char *keyword;
    5. xmlDocPtr doc;
    6. if (argc <= 2) {
    7. printf("Usage: %s docname, keyword\n", argv[0]);
    8. return(0);
    9. }
    10. docname = argv[1];
    11. keyword = argv[2];
    12. doc = parseDoc (docname, keyword);
    13. if (doc != NULL) {
    14. xmlSaveFormatFile (docname, doc, 0);
    15. xmlFreeDoc(doc);
    16. }
    17. return (1);
    18. }
    Alles anzeigen


    Hast du Java - Vergangenheit?

    Quellcode

    1. if (doc != NULL)


    macht keinen Sinn, da doc kein Pointer ist. Der Compiler sollte warnen (eher einen Fehler ausgeben oder gibts einen Vergleich zwischen void* und xmlDocPtr?
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • "d0nUt" schrieb:

    "darthdespotism" schrieb:

    Ein Crossposter ;)

    Ich habe den Thread verschoben, weil das kein XML Sprachproblem ist. Im XML Forum ist noch noch ein Verweis hierher.

    Ich meine eigentlich jetzt noicht CrossTopc sondern Crossforum ;)
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • "darthdespotism" schrieb:

    "d0nUt" schrieb:

    "darthdespotism" schrieb:

    Ein Crossposter ;)

    Ich habe den Thread verschoben, weil das kein XML Sprachproblem ist. Im XML Forum ist noch noch ein Verweis hierher.

    Ich meine eigentlich jetzt noicht CrossTopc sondern Crossforum ;)


    tree.h

    Quellcode

    1. XMLPUBFUN int XMLCALL
    2. xmlSaveFormatFile (const char *filename,
    3. xmlDocPtr cur,
    4. int format);


    Kanns aber leider nicht kompilieren da ich mom nur über IFS/ext2 auf meiner Ubuntu-Systempartition die datei geöffnet habe aber momentan NT5.1 laufen hab.

    EDIT://
    Sorry für den Doppelpost ;)
    Wenn ich das nochmal genauer betrachte dürfte der xmlDocPtr nur ein typedef oder was ähnliches sein, dann hast du natürlich recht mit den überprüfungen auf NULL

    Soweit ich das sehen kann stimmt der Prototyp in tree.h mit dem überein was du verwendest .

    EDIT://
    Irgendwelche Warnings? Bist du dir sicher dass er die entsprechenden Header auch findet? Vielleicht ist der ja irgendwo verlohren gegangen

    EDIT://
    Kompilieren sollte ja gehen, auch wenn ich die Lib nicht linken kann:

    Quellcode

    1. P:\IDEs\VC8\VC>g++ main.cpp -IR:\usr\include\libxml2
    2. In file included from R:/usr/include/libxml2/libxml/parser.h:796,
    3. from R:/usr/include/libxml2/libxml/globals.h:18,
    4. from R:/usr/include/libxml2/libxml/threads.h:35,
    5. from R:/usr/include/libxml2/libxml/xmlmemory.h:216,
    6. from main.cpp:4:
    7. R:/usr/include/libxml2/libxml/encoding.h:28:19: error: iconv.h: No such file or
    8. directory
    9. In file included from R:/usr/include/libxml2/libxml/parser.h:796,
    10. from R:/usr/include/libxml2/libxml/globals.h:18,
    11. from R:/usr/include/libxml2/libxml/threads.h:35,
    12. from R:/usr/include/libxml2/libxml/xmlmemory.h:216,
    13. from main.cpp:4:
    14. R:/usr/include/libxml2/libxml/encoding.h:136: error: 'iconv_t' does not name a t
    15. ype
    16. R:/usr/include/libxml2/libxml/encoding.h:137: error: 'iconv_t' does not name a t
    17. ype
    18. main.cpp: In function 'void parseStory(xmlDoc*, xmlNode*, char*)':
    19. main.cpp:12: error: invalid conversion from 'const char*' to 'const xmlChar*'
    20. main.cpp:12: error: initializing argument 3 of 'xmlNode* xmlNewTextChild(xmlNo
    21. de*, xmlNs*, const xmlChar*, const xmlChar*)'
    22. main.cpp:12: error: invalid conversion from 'char*' to 'const xmlChar*'
    23. main.cpp:12: error: initializing argument 4 of 'xmlNode* xmlNewTextChild(xmlNo
    24. de*, xmlNs*, const xmlChar*, const xmlChar*)'
    25. P:\IDEs\VC8\VC>
    Alles anzeigen


    Edit://
    Reduziert sich mit ordentlichen -I s auf folgendes:

    Quellcode

    1. P:\IDEs\VC8\VC>g++ main.cpp -IR:\usr\include\libxml2 -IR:\usr\include -IR:\usr\i
    2. nclude\c++\4.1.2
    3. main.cpp: In function 'void parseStory(xmlDoc*, xmlNode*, char*)':
    4. main.cpp:12: error: invalid conversion from 'const char*' to 'const xmlChar*'
    5. main.cpp:12: error: initializing argument 3 of 'xmlNode* xmlNewTextChild(xmlNo
    6. de*, xmlNs*, const xmlChar*, const xmlChar*)'
    7. main.cpp:12: error: invalid conversion from 'char*' to 'const xmlChar*'
    8. main.cpp:12: error: initializing argument 4 of 'xmlNode* xmlNewTextChild(xmlNo
    9. de*, xmlNs*, const xmlChar*, const xmlChar*)'
    10. P:\IDEs\VC8\VC>
    Alles anzeigen

    Ich denke da ist irgendetwas mit deinem Setup schiefgelaufen.

    EDIT://
    Voller Source des Minimalbeispiels:

    Quellcode

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. #include <libxml/xmlmemory.h>
    5. #include <libxml/parser.h>
    6. //Hier nochmal tree.h inkludiert!
    7. #include <libxml/tree.h>
    8. void
    9. parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
    10. xmlNewTextChild (cur, NULL, "keyword", keyword);
    11. return;
    12. }
    13. xmlDocPtr
    14. parseDoc(char *docname, char *keyword) {
    15. xmlDocPtr doc;
    16. xmlNodePtr cur;
    17. doc = xmlParseFile(docname);
    18. if (doc == NULL ) {
    19. fprintf(stderr,"Document not parsed successfully. \n");
    20. return (NULL);
    21. }
    22. cur = xmlDocGetRootElement(doc);
    23. if (cur == NULL) {
    24. fprintf(stderr,"empty document\n");
    25. xmlFreeDoc(doc);
    26. return (NULL);
    27. }
    28. if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    29. fprintf(stderr,"document of the wrong type, root node != story");
    30. xmlFreeDoc(doc);
    31. return (NULL);
    32. }
    33. cur = cur->xmlChildrenNode;
    34. while (cur != NULL) {
    35. if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
    36. parseStory (doc, cur, keyword);
    37. }
    38. cur = cur->next;
    39. }
    40. return(doc);
    41. }
    42. int
    43. main(int argc, char **argv) {
    44. char *docname;
    45. char *keyword;
    46. xmlDocPtr doc;
    47. if (argc <= 2) {
    48. printf("Usage: %s docname, keyword\n", argv[0]);
    49. return(0);
    50. }
    51. docname = argv[1];
    52. keyword = argv[2];
    53. doc = parseDoc (docname, keyword);
    54. if (doc != NULL) {
    55. xmlSaveFormatFile (docname, doc, 0);
    56. xmlFreeDoc(doc);
    57. }
    58. return (1);
    59. }
    Alles anzeigen
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Wow! Da hat sich ja einiges getan. Verschieben war sinnvoll, dass stimmt :)

    Erstmal vielen Dank für die Antworten!

    Ja, ich habe Java-Vergangenheit ;)

    Mitlerweile habe ich noch etwas daran rumgebastelt aber bin leider noch zu keinem Ergebnis gekommen.

    Was ich weis ist, dass die includes funktionieren. Parser.h beispielsweise wird offensichtlich richtig inkludiert da die dort enthaltenden funktionen benutzt werden können. tree.h. wird im Parser inkludiert und enthält ja xmlSaveFormatFile(). D.h. es kann im Prinzip weder an den includes noch an einer nicht vorhandenen Bib liegen da alles funktioniert. Z.B. kann ich in dem tree des XML rumnavigieren, Elemente verändern...usw. Nur das abspeichern funktioniert nicht :(

    Hierzu kann ich nur sagen:
    main.cpp:12: error: invalid conversion from 'const char*' to 'const xmlChar*'

    Das Tutorial ist 1:1 kopiert. ich persönlich habe einen etwas anderen Code aber an den gleichen stellen harkt es. Egal ob ich das Tutorial oder folgenden Code kompilieren will, die Funktion wird nicht gefunden.

    Beim Setup kann auch nicht soviel falsch gelaufen sein. libxml2.a linken und die includes...mehr wird nicht verlangt.

    Den Code benutze ich momentan...Der macht nicht viel Sin, weiss ich wohl aber zum erlernen wie ich mit libxml umgehen muss reicht er :) Mal abgesehen davon das er nicht funktioniert


    Quellcode

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. #include <libxml/xmlmemory.h>
    5. #include <libxml/parser.h>
    6. #include <libxml/tree.h>
    7. #include <iostream>
    8. using namespace std;
    9. void parseStory (xmlDocPtr doc, xmlNodePtr cur, char *attr) {
    10. xmlChar *key;
    11. cur = cur->xmlChildrenNode;
    12. while (cur != NULL) {
    13. if ((!xmlStrcmp(cur->name, (const xmlChar *)attr))) {
    14. key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
    15. printf("keyword: %s\n", key);
    16. xmlFree(key);
    17. }
    18. cur = cur->next;
    19. }
    20. return;
    21. }
    22. static void parseDoc(char *docname, char *child, char *attr, char *nodeDesc, char *nodeVal) {
    23. xmlDocPtr doc;
    24. xmlNodePtr cur;
    25. doc = xmlParseFile(docname);
    26. if (doc == NULL ) {
    27. fprintf(stderr,"Document not parsed successfully. \n");
    28. return;
    29. }
    30. cur = xmlDocGetRootElement(doc);
    31. if (cur == NULL) {
    32. fprintf(stderr,"empty document\n");
    33. xmlFreeDoc(doc);
    34. return;
    35. }
    36. //Prüft ob das Dokument dem richtigen Typ entspricht (hier story)
    37. if (xmlStrcmp(cur->name, (const xmlChar *) "YMResult")) {
    38. fprintf(stderr,"document of the wrong type, root node != YMResult");
    39. xmlFreeDoc(doc);
    40. return;
    41. }
    42. cur = cur->xmlChildrenNode;
    43. while (cur != NULL) {
    44. if ((!xmlStrcmp(cur->name, (const xmlChar *)child))){
    45. xmlNewTextChild (cur, NULL, (const xmlChar *)nodeDesc, (const xmlChar *)nodeVal);
    46. //Hier gibt es Probleme!
    47. xmlSaveFormatFile (docname, doc, 1);
    48. xmlFreeDoc(doc);
    49. //parseStory (doc, cur, attr);
    50. }
    51. cur = cur->next;
    52. }
    53. xmlFreeDoc(doc);
    54. return;
    55. }
    56. int main(int argc, char **argv) {
    57. char *docname ="result.xml";
    58. parseDoc (docname, "ListNav","Count", "NeuerKnoten", "NeuerWert");
    59. system("PAUSE");
    60. return EXIT_SUCCESS;
    61. }
    Alles anzeigen


    Ich weiss echt nicht mehr, woran es noch liegen kann
  • "lokiht" schrieb:


    Hierzu kann ich nur sagen:
    main.cpp:12: error: invalid conversion from 'const char*' to 'const xmlChar*'


    Den Fehler würde ich nicht alzu ernst nehmen. Das kann schlicht daran liegen dass ich Unter Win NT5.1 g++ 4.2 gegen Includes für Linux 2.6.20 g++ 4.1.2 compiliere.

    Wenn dein tree.h da ist wo es hingehört und der Compiler keine Warnings ausgibt bin ich erstmal am Ende.

    Hast du mit den Optionen

    Quellcode

    1. -Wall -v
    mal versucht das zu compilieren?
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Das funktioniert leider auch nicht! :(

    Ich habe mir nun überlegt es so zu macen, dass ich das gesamte XML in einem String speichere und diesen dann in eine Datei schreibe.

    Also: xml parsen ->xml bearbeiten->xmlToString->StringToFile

    Nun stellt sich mir die Frage wie ich möglichst effizient das XML in einen String schreibe. Kann mir da jemand weiterhelfen?

    Vielen Dank
  • -Wall war auch nicht dazugedacht dadurch das Programm erfolgreich zu erstellen, sondern nur um evtl. nützliche Fehlermeldungen zu bekommen.

    Kannst du mir die Commandline geben mit der du das erstellst?
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Gut zu wissen mit -Wall
    Ich mache das mit Dev-Cpp...

    Hier mal das LOG:

    Compiler: Default compiler
    Building Makefile: "D:\Projekte\C++\Makefile.win"
    Führt make... aus
    make.exe -f "D:\Projekte\C++\Makefile.win" all
    g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include/libxml" -I"D:/Downloads/C++/XML-Paarser/libxml/libxml2-2.6.28.win32/include/libxml"

    main.cpp: In function `void parseDoc(char*, char*, char*, char*, char*)':
    main.cpp:67: error: `xmlSaveFormatFile' undeclared (first use this function)
    main.cpp:67: error: (Each undeclared identifier is reported only once for each function it appears in.)

    make.exe: *** [main.o] Error 1

    Ausführung beendet


    Ich hoffe, dass das drin steht was du brauchst.
  • Hast du NT6 / Vista?
    Da gibt es wohl immer wieder probleme mit dem MinGW wenn die Dateien nicht alle auf einer Partition sind?

    btw: Kannst dir mal codeblocks.org/ ansehen, ist eine echt gute FOSS C++ IDE die im Gegesatz zum Dev-Cpp aktiv weiterentwikelt wird.
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Ich habe XP Mediacenter....

    Danke für den IDE-Tip....Mit Dev-Cpp fehlen mir einfach auch viele funktionen, die ich gerne hätte.

    Habe nun codeblocks ausprobiert. Sieht auf den ersten Blick sehr gut aus. Leider findet er da meine Header nicht mehr.
    Wie kann ich Code::Blocks denn sagen, wo er meine Header suchen soll?
  • Normalerweise kannst du unter Settings->Compiler->Searchpaths das einstellen, alternativ die Pfade natürlich per -I in den opionen eintragen.

    Zu deinem Problem nochmal: Du bindest 2 mal libxml ein per -I nach deinem LOG welche tree.h hast du auf die Funktion durchsucht? wo liegt die genau?
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)