XML Dokument speichern mit libxml2



  • Hallo,
    ich arbeite nun seit kurzem an einem Projekt welches XML nutzt. 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



  • Gibt es vielleicht eine Alternative Möglichkeit das XML-Dokument zu speichern?



  • Bist du dir denn ganz sicher, dass du den passenden Header für diese Funktion inkludiert hast?



  • Vielen Dank für die Antwort.

    Das sind meine includes:

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

    Das sind die, die auch im Tutorial inkludiert werden in dem das speichern eines XML-Dokumentes behandelt wird.

    Sollte die Funktion xmlSaveFormatFile in einer der Header deklariert sein?
    Ich habe nämlich keinen Hinweis darauf gefunden in den einzelnen Headern (xmlmemory.h, Parser.h)



  • In der Datei tree.h wird die Funktion xmlSaveFormatFile deklariert. Und parser.h inkludiert normalerweise tree.h
    Du könntest mal versuchen tree.h in deiner .cpp zu inkludieren, vielleicht geht es dann.



  • Vielen Dank!

    Parser.h inkludiert tree.h und in der tree.h fand ich auch die Funktion xmlSaveFormatFile(). Leider funktioniert es immer noch nicht trotz des inkludierens der tree.h

    vielleicht sehe ich den Wald ja auch vor lauter Bäumen nicht.

    Hier mal der gesamte Code des Tutorials. Wie schon oben geschrieben verursacht lediglich die Funktion xmlSaveFormatFile() einen fehler. ALLE anderen funktionieren.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <libxml/xmlmemory.h>
    #include <libxml/parser.h>
    //Hier nochmal tree.h inkludiert!
    #include <libxml/tree.h>
    
    void
    parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
    
    	xmlNewTextChild (cur, NULL, "keyword", keyword);
        return;
    }
    
    xmlDocPtr
    parseDoc(char *docname, char *keyword) {
    
    	xmlDocPtr doc;
    	xmlNodePtr cur;
    
    	doc = xmlParseFile(docname);
    
    	if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return (NULL);
    	}
    
    	cur = xmlDocGetRootElement(doc);
    
    	if (cur == NULL) {
    		fprintf(stderr,"empty document\n");
    		xmlFreeDoc(doc);
    		return (NULL);
    	}
    
    	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    		fprintf(stderr,"document of the wrong type, root node != story");
    		xmlFreeDoc(doc);
    		return (NULL);
    	}
    
    	cur = cur->xmlChildrenNode;
    	while (cur != NULL) {
    		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
    			parseStory (doc, cur, keyword);
    		}
    
    	cur = cur->next;
    	}
    	return(doc);
    }
    
    int
    main(int argc, char **argv) {
    
    	char *docname;
    	char *keyword;
    	xmlDocPtr doc;
    
    	if (argc <= 2) {
    		printf("Usage: %s docname, keyword\n", argv[0]);
    		return(0);
    	}
    
    	docname = argv[1];
    	keyword = argv[2];
    	doc = parseDoc (docname, keyword);
    	if (doc != NULL) {
    		xmlSaveFormatFile (docname, doc, 0);
    		xmlFreeDoc(doc);
    	}
    
    	return (1);
    }
    

    Fehlermeldung:

    `xmlSaveFormatFile' undeclared (first use this function)



  • Kann es denn überhaupt sein, dass mir der Compiler "`xmlSaveFormatFile' undeclared (first use this function)" liefet, wenn die Funktion nachweislich in der inkludierten Headerdatei zu finden ist? Ich benutze übrigens Dev-Cpp. Vielleicht hat es etwas damit zu tun?

    Bitte helft mir ich weis wirklich nicht, was ich da noch machen kann.

    Vielen Dank


Anmelden zum Antworten