Большинство анализаторов XML используют объекты XML-узлов и на их основе создают основные функциональные интерфейсы. Главная особенность этого анализатора — он основан на объектах XML-элементов, производных от объектов XML-узлов, что упрощает работу с функциями, связанными с XML-элементами. Поэтому при использовании simple_xml основное внимание уделяется соответствующим интерфейсам для объектов XML-элементов.
/**
* @brief Загрузка файла XML
*
* @param path Путь к файлу XML
*
* @return Возвращает объект элемента XML корня
* */
struct xmlelement * xml_load( char * path );
Объект элемента корня XML, возвращаемый функцией xml_load, представляет собой уже проанализированный файл XML, и вся информация в файле XML связана с объектом элемента корня. Пример использования можно найти в функции xml_example_run в файле xml_test.c.
/**
* @brief Сохранение объекта элемента XML (корня) в указанный файл XML
*
* @param tree Объект элемента XML (корень)
* @param path Путь файла XML
*
* @return 1 : Успех, иначе неудача
* */
int xml_save(struct xmlelement *tree, char *path);
Если вы хотите сохранить изменения, внесённые в дочерние элементы или атрибуты объекта элемента корня, необходимо вызвать функцию xml_save. В противном случае изменения будут потеряны. После сохранения объект элемента корня всё ещё существует. Если он больше не нужен, освободите память, чтобы предотвратить утечку памяти. Пример использования можно найти в функции xml_example_run в файле xml_test.c.
/**
* @brief Создание узла элемента
*
* @param string Тег элемента XML и атрибут
* @param text Текст элемента XML
* @param type Тип узла XML
*
* @return Успех: возвращает объект узла элемента, иначе NULL
*/
struct xmlelement *xmlelement_create( char *string, char *text, enum xmlnode_type type );
Например:
struct xmeleme
nt *tree = xmlelement_create("name", "test create", ELEMENT_NODE);
test create
* Уничтожение объекта элемента XML:
/**
При освобождении списка дочерних элементов также проверяется, есть ли у каждого дочернего элемента дочерний элемент. Если да, то они удаляются вместе.
* Получение тега элемента XML:
/**
* Получение атрибута элемента XML:
Объекты элементов XML могут иметь несколько атрибутов. Следующие функции используются для получения всех атрибутов.
/**
Получение строки атрибута:
/**
Получить атрибут элемента по индексу:
/**
Получает значение атрибута как целое число:
/**
Получает значение атрибута как число с плавающей точкой:
/**
Проверяет, равно ли значение атрибута целевому значению строки:
/**
* Установка атрибута элемента XML:
Установка значения атрибута в строковом формате:
/**
Установка значения атрибута в десятичном целочисленном формате:
/**
Устанавливает значение атрибута в шестнадцатеричном целочисленном формате:
/**
Устанавливает значение атрибута в формате числа с плавающей точкой:
/**
**Получение и установка атрибута элемента объекта с плавающей точкой**
int xmlelement_setattrbyfloat(void *this, char *name, float value);
*Получение текстового содержимого элемента XML-объекта*
/**
*Установка текстового содержимого элемента XML-объекта*
/**
*Перебор списка дочерних элементов XML-объекта*
Способ 1. Непосредственное получение списка дочерних узлов элемента, пользователь сам использует цикл for для перебора каждого дочернего узла.
/**
Способ 2. Получение первого дочернего элемента узла через тег, а затем использование функции xmlnode_getnext() для обхода каждого дочернего узла. Рекомендуется использовать этот способ, так как он не требует дополнительного выделения памяти.
/**
Способ 3. Получение количества дочерних узлов через функцию xmelelement_getchildnum, а затем использование функции xmelelement_indexofchild для обхода каждого дочернего узла.
/**
/**
*Добавление дочернего элемента*
/**
*Удаление дочернего элемента*
Дочерний элемент также является обычным элементом, и его можно удалить с помощью функции xmelelement_delete. Если необходимо удалить все дочерние элементы, можно использовать следующую функцию:
/**
## Как расширить файловую систему
На примере системы Linux реализуем функции open, gets, puts, close.
#include <stdio.h> void *local_open(char *file_name, char *mode) { FILE *file = fopen(file_name, mode); return file; }
char *local_gets(char *buf, int size, void *file) { return fgets(buf, size, file); }
int local_puts(char *buf, void *file) { return fputs(buf, file); }
void local_close(void *file) { fclose(file); }
Определим структуру xmlfileops:
static struct xmlfileops ops = { .open = local_open, .gets = local_gets, .puts = local_puts, .close = local_close};
Перед использованием функций другого программного стека XML используем функцию xml_fconfig для передачи структуры xmlfileops в программный стек XML.
xml_fconfig(&ops);
## Как расширить динамическое управление памятью
На примере системы Linux реализуем функции malloc, free, memset. Здесь используются макроопределения, но также можно использовать функции.
#include <memory.h> #define local_malloc malloc #define local_free free #define local_memset memset
Определим структуру xmlmemops:
static struct xmlmemops ops = { .malloc = local_malloc, .free = local_free, .memset = local_memset, };
Прежде чем использовать функции другого программного стека XML, используем функцию xml_mconfig для передачи структуры xmlmemops в программный стек XML.
xml_mconfig(&ops);
## Функция проверки памяти
Программный стек simple_xml использует динамическую память, что может привести к утечке памяти и снижению качества программного обеспечения. Поэтому мы добавили функцию проверки памяти.
*Использование*
В параметрах компиляции добавьте макрос XML_MEM_CHECK, чтобы включить функцию проверки памяти, и используйте функцию xml_memory_show для вывода информации об использовании памяти. Например:
Memory in xml stack total : 0 blocks : 0
*Принцип проверки*
Сохраняем адреса и размеры блоков памяти, выделенных в xml_malloc, в списке. Обновляем количество блоков памяти и объём используемой памяти.
Удаляем блоки памяти из списка в xml_free и обновляем количество блоков и объём памяти.
*Риски*
Стратегия проверки также использует динамическую память. Использование этой функции может повлиять на требования к максимальной памяти. Рекомендуется включать эту функцию только в модульных тестах.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )