#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";
Спасибо, Люк.