libxml доступ к содержимому узла вызывает выход из приложения - PullRequest
0 голосов
/ 08 апреля 2011

Я новичок в libxml и сталкиваюсь со странным поведением: когда я пытаюсь получить доступ к содержимому и xmlNode, приложение молча завершает работу.

Мой код:

// Initialisation des pointeurs
xmlDocPtr doc;
xmlXPathContextPtr xpath_context;
xmlXPathObjectPtr xpath_objects;

// Chargement du document et création du contexte pour xpath
doc = xmlParseFile(nom.c_str());
xpath_context = xmlXPathNewContext(doc);

// Recherche via xpath
xpath_objects = xmlXPathEvalExpression((xmlChar*)("//personnage/nom"), xpath_context);
if(xpath_objects == NULL)
    cout << "La balise nom est obligatoire !\n";

// Affichage des résultats
cout << "Nom de la balise : " << xpath_objects->nodesetval->nodeTab[0]->name << "\n";
cout << "Valeur de la balise : " << (char*)(xpath_objects->nodesetval->nodeTab[0]->content) << "\n";
cout << "Fin\n";

// Libération de la mémoire
xmlXPathFreeObject(xpath_objects);
xmlXPathFreeContext(xpath_context);
xmlFreeDoc(doc);

Мой XML-файл:

<personnage>

    <nom>Toto</nom>

</personnage>

Описание xmlNode:

Structure xmlNode
struct _xmlNode {
    void *  _private    : application data
    xmlElementType  type    : type number, must be second !
    const xmlChar * name    : the name of the node, or the entity
    struct _xmlNode *   children    : parent->childs link
    struct _xmlNode *   last    : last child link
    struct _xmlNode *   parent  : child->parent link
    struct _xmlNode *   next    : next sibling link
    struct _xmlNode *   prev    : previous sibling link
    struct _xmlDoc *    doc : the containing document End of common p
    xmlNs * ns  : pointer to the associated namespace
    xmlChar *   content : the content
    struct _xmlAttr *   properties  : properties list
    xmlNs * nsDef   : namespace definitions on this node
    void *  psvi    : for type/PSVI informations
    unsigned short  line    : line number
    unsigned short  extra   : extra data for XPath/XSLT
}

Полная документация доступна здесь: http://xmlsoft.org/html/libxml-tree.html#xmlNode

И это вывод:

Nom de la balise : nom
Valeur de la balise : damien@caturday:~$

Может ли кто-нибудь помочь мне, пожалуйста?

Спасибо,

Дэмиен

1 Ответ

0 голосов
/ 09 апреля 2011

На самом деле, как говорит Люк, для libxml содержимое xmlNode - это другой узел. Таким образом, мы должны получить доступ к дочерним элементам, чтобы прочитать содержимое выбранного узла.

В моем случае решение:

cout << "Valeur de la balise : " << (char*)(xpath_objects->nodesetval->nodeTab[0]->children->content) << "\n";

Спасибо, Люк.

...