доступ libxml к содержимому узла вызывает выход приложения

#c #libxml2

#c #libxml2

Вопрос:

Я новичок в 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 << "Finn";

// 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. @DumbCoder Нет, я еще не нашел решение. Если я удалю cout << "Valeur de la balise : " << (char*)(xpath_objects->nodesetval->nodeTab[0]->content) << "n"; приложение, оно не завершится с ошибкой.

2. XML DOM здесь несколько неинтуитивен. Вам необходимо получить доступ к nodeTab[0]-> дочерние элементы-> содержимое, поскольку «Toto» — это содержимое безымянного текстового узла, который является дочерним элементом элемента «nom».

Ответ №1:

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

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

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

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