Я работаю над парсером для получения данных из XML-файла. Я использую libxml2 для извлечения данных. Я не могу получить атрибуты из узлов. Я только нашел nb_attributes
, чтобы получить количество атрибутов.Как получить атрибуты из узла в libxml2
ответ
Попробуйте что-то вроде:
xmlNodePtr node; // Some node
NSMutableArray *attributes = [NSMutableArray array];
for(xmlAttrPtr attribute = node->properties; attribute != NULL; attribute = attribute->next){
xmlChar *content = xmlNodeListGetString(node->doc, attribute->children, YES);
[attributes addObject:[NSString stringWithUTF8String:content]];
xmlFree(content);
}
Я думаю joostk имел в виду attribute-> детей, давая что-то вроде этого:
xmlAttr* attribute = node->properties;
while(attribute)
{
xmlChar* value = xmlNodeListGetString(node->doc, attribute->children, 1);
//do something with value
xmlFree(value);
attribute = attribute->next;
}
Смотрите, если это работает для вас.
Hi Mat. Я нашел ваш код полезным для определения значений атрибута. Но он дает значение только для первого узла. Как получить значения для следующих узлов. ??.. Заранее спасибо. – NiKKi
Вы можете перебирать узлы так же, как итерации по атрибутам: node = node-> next. –
, если вы просто хотите, один атрибут, используйте xmlGetProp или xmlGetNsProp
Я думаю, что я нашел, почему вы получили только 1 атрибут (по крайней мере, это случилось со мной).
Проблема заключалась в том, что я читал атрибуты для первого узла, а затем был текстовым узлом. Не знаю, почему, но свойства node-> дают мне ссылку на неотчитываемую часть памяти, поэтому она разбилась.
Мое решение было проверить тип узла (элемент 1)
Я использую читателя, так:
xmlTextReaderNodeType(reader)==1
Весь код, который вы можете получить его из http://www.xmlsoft.org/examples/reader1.c и добавить
xmlNodePtr node= xmlTextReaderCurrentNode(reader);
if (xmlTextReaderNodeType(reader)==1 && node && node->properties) {
xmlAttr* attribute = node->properties;
while(attribute && attribute->name && attribute->children)
{
xmlChar* value = xmlNodeListGetString(node->doc, attribute->children, 1);
printf ("Atributo %s: %s\n",attribute->name, value);
xmlFree(value);
attribute = attribute->next;
}
}
к линии 50.
При использовании метода SAX startElementNs (...), эта функция является то, что вы ищете:
xmlChar *getAttributeValue(char *name, const xmlChar ** attributes,
int nb_attributes)
{
int i;
const int fields = 5; /* (localname/prefix/URI/value/end) */
xmlChar *value;
size_t size;
for (i = 0; i < nb_attributes; i++) {
const xmlChar *localname = attributes[i * fields + 0];
const xmlChar *prefix = attributes[i * fields + 1];
const xmlChar *URI = attributes[i * fields + 2];
const xmlChar *value_start = attributes[i * fields + 3];
const xmlChar *value_end = attributes[i * fields + 4];
if (strcmp((char *)localname, name))
continue;
size = value_end - value_start;
value = (xmlChar *) malloc(sizeof(xmlChar) * size + 1);
memcpy(value, value_start, size);
value[size] = '\0';
return value;
}
return NULL;
}
Использование:
char * value = getAttributeValue("atrName", attributes, nb_attributes);
// do your magic
free(value);
Самый простой способ я нашел, используя libxml2 (через Libxml ++ в C++) был использовать eval_to_XXX
методы. Они оценивают выражение XPath, поэтому вам нужно использовать синтаксис @property
.
Например:
std::string get_property(xmlpp::Node *const &node) {
return node->eval_to_string("@property")
}
Более эффективным и прямым способом с libxml ++ является 'return std :: string (dynamic_cast
- 1. Как получить атрибуты из узла xml
- 2. libxml2 не может получить содержание от узла
- 3. Как получить атрибуты узла Neo4j
- 4. Как получить атрибуты XML-узла в C#
- 5. Изменение пространства имен узла libxml2
- 6. Как получить атрибуты корневого узла на java
- 7. копия узла атрибуты родительского узла
- 8. Python 2.7 libxml2, XPath, экстракт XML атрибуты
- 9. Как удалить все атрибуты узла?
- 10. ext.net 2,0 - получить пользовательские атрибуты узла дерева
- 11. Как удалить атрибуты из узла XML в groovy
- 12. Как атрибуты узла узла определяют его имя в php simplexml?
- 13. Как получить список libxml2 API?
- 14. Как получить ключи xmlHashTable? (libxml2)
- 15. Получить значение дочернего узла из XML, которые имеют одиночные атрибуты
- 16. Получить автоматические атрибуты от узла-шеф-повара
- 17. php dom получить все атрибуты узла
- 18. Как удалить атрибуты узла (MSXML)
- 19. Как увидеть все атрибуты узла в Maya?
- 20. Как получить все атрибуты для конкретного узла xml в qt
- 21. Как получить атрибуты узла в контекстном меню jstree
- 22. Как получить атрибуты узла в jstree данных JSON
- 23. Объединить атрибуты узла из двух списков
- 24. Атрибуты тела доступа запроса узла
- 25. Как отображать атрибуты в XSLT определенного узла?
- 26. Как получить элементы и атрибуты href для каждого узла?
- 27. Как редактировать атрибуты узла в Javascript
- 28. Назначение узла произвольному узлу, как с помощью Libxml2?
- 29. Как получить элемент из узла
- 30. Получить значения и атрибуты узла как массив с помощью xpath
Привет Mat. Я нашел ваш код полезным для определения значений атрибута. Но он дает значение только для первого узла. Как получить значения для следующих узлов. ??.. Заранее спасибо. – NiKKi
Не следует ли 'node-children' становиться' атрибутом-> детьми'? –
Да, это должно :) Также см. @Matthew Lowe, он заметил ошибку ранее. Я обновил ответ (2,5 года спустя;)) – Joost