LINUX.ORG.RU

[ libxml2 ] как получить значение атрибута?


0

1

Доброго времени суток, разбираюсь тут с libxml2, есть такой кусочек кода:

 
if(!xmlStrcmp(node->name,(const xmlChar *)"Position")) {
    xmlAttrPtr attr = node->properties;
    for(; attr; attr=attr->next) {
        printf("%s\n", attr->name);
    }				
}
здесь я прохожу по всем атрибутам ноды и вывожу имя атрибута, а как получить значение атрибута? В мануале по этой структуре видим:

struct _xmlAttr {
    void *	_private	: application data
    xmlElementType	type	: XML_ATTRIBUTE_NODE, must be second !
    const xmlChar *	name	: the name of the property
    struct _xmlNode *	children	: the value of the property

т.е children - значение атрибута? ничего не понимаю, растолкуйте :)

★★★★★
Ответ на: комментарий от archimag

Это немного не то, это если например у меня в xml написано так:

<position> 10 </position>

то для узла position вернётся 10, а мне нужно вот такое:

<position x="10" y="20"/> 

Вот если для этого узла(position) получить атрибуты и перебирать их:

 
xmlAttrPtr attr = node->properties;
for(; attr; attr=attr->next) {
   printf("%s\n", attr->name);  
}            

то attr->name будет выдавать x и y, а мне нужно получить 10 и 20 :)

xterro ★★★★★
() автор топика
Ответ на: комментарий от xterro

Вообще, при работе с libxml2 можешь не обращать внимания на типы, ибо там реально есть только xmlNode, а всё остальное сугубо для внутреннего применения. Разные функции могу вернуть один и тот же узел в одном случае как xmlNode, а в другом как xmlAttr. Вообще, там полное дерьмо внутри, у которого, правда, есть одно достоинство - оно работает )

archimag ★★★
()
Ответ на: комментарий от xterro

> Так это же разные структуры?..

Посмотри на объявления структур для разных типов в libxml2, они все имеют два одинаковых первых поля, включая поле типа. Собственно, поэтому очень не рекомендуется трогать элементы этих структур напрямую, ибо не безопасно, хрен знает что там на самом деле, лучше все операции делать через предоставленные функции.

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