LINUX.ORG.RU

libxml2, XPath и namespace


0

0

не дайте пропасть други :^)

пытаюсь получить value из вот такого XML'я:

<?xml version="1.0"?>
<first>
<second xmlns="xxx:yyy:zzz">
<third>value</third>
</second>
</first>

делаю для этого нижеследующий кодъ
он работает если убрать xmlns.. пытался заюзать xmlXPathRegisterNs,
но к положительному результату это не привело...

подскажите как быть!

------------------------------- code --------------------------------

#include <stdio.h>
#include <string.h>

#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>

int
main(void)
{
        char msg[] = "<?xml version=\"1.0\"?>\n<first>\n<second xmlns=\"xxx:yyy:zzz\">\n<third>value</third>\n</second></first>\n";
        xmlDoc *doc = NULL;
        xmlXPathContextPtr context;
        xmlXPathObjectPtr result;

        LIBXML_TEST_VERSION

        doc = xmlReadMemory(msg, sizeof(msg), "noname.xml", NULL,
            XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_RECOVER);
        if (doc == NULL) {
                fprintf(stderr, "Failed!\n");
                return (-1);
        }

        context = xmlXPathNewContext(doc);
        if (context == NULL) {
                printf("Error in xmlXPathNewContext\n");
                return 2;
        }
        result = xmlXPathEval((xmlChar*)"/first/second/third", context);
        xmlXPathFreeContext(context);
        if (result == NULL) {
                printf("Error in xmlXPathEval\n");
                return 2;
        }
        if (result->type == XPATH_NODESET)
                printf("third=%s\n",
                    xmlXPathCastNodeSetToString(result->nodesetval));

        xmlFreeDoc(doc);

        xmlCleanupParser();

        xmlMemoryDump();

        return (0);
}
anonymous

это твой случай :)

int
main(void)
{
    char msg[] = "<?xml version=\"1.0\"?>\n<first>\n<second xmlns=\"xxx:yyy:zzz\">\n<third>value</third>\n</second></first>\n";
    xmlDoc *doc = NULL;
    xmlXPathContextPtr context;
    xmlXPathObjectPtr result;

    LIBXML_TEST_VERSION

        doc = xmlReadMemory(msg, sizeof(msg), "noname.xml", NULL,
                XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_RECOVER);
    if (doc == NULL) {
        fprintf(stderr, "Failed!\n");
        return (-1);
    }

    context = xmlXPathNewContext(doc);
    if (context == NULL) {
        printf("Error in xmlXPathNewContext\n");
        return 2;
    }
    xmlXPathRegisterNs(context, "xyz", "xxx:yyy:zzz");
    result = xmlXPathEval((xmlChar*)"/first/xyz:second/xyz:third", context);
    xmlXPathFreeContext(context);
    if (result == NULL) {
        printf("Error in xmlXPathEval\n");
        return 2;
    }
    if (result->type == XPATH_NODESET)
        printf("third=%s\n",
                xmlXPathCastNodeSetToString(result->nodesetval));

    xmlFreeDoc(doc);

    xmlCleanupParser();

    xmlMemoryDump();

    return (0);
}


denis libxml2 $ gcc test.c `pkg-config --libs --cflags libxml-2.0`
denis libxml2 $ ./a.out 
third=value

anonymous
()
Ответ на: комментарий от anonymous

супер! значит я делал просто криво!
спасибо!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.