libxml访问节点的内容导致应用程序退出

时间:2011-04-08 14:50:16

标签: 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 << "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 :(得分:0)

事实上,正如Luke所说,对于libxml,xmlNode的内容是另一个节点。 因此,我们必须访问子节点才能读取所选节点的内容。

就我而言,解决方案是:

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

谢谢卢克。