設計目標
- 零動態記憶體分配:解析前預分配緩衝區,樹節點直接在緩衝區內構建,無碎片,適合無 MMU 設備(ARM7/Cortex-M)。
- 極簡依賴:僅需標準 C 庫,約 600 行核心代碼。
- 功能聚焦:支援 ANSI 編碼 XML 解析,不支援生成、命名空間、DTD、XPath。
核心資料結構
typedef struct _MINI_XML_ATTRI {
char *name, *value;
struct _MINI_XML_ATTRI *next;
} MINI_XML_ATTRI;
typedef struct _MINI_XML_NODE {
char *name, *value;
MINI_XML_ATTRI *attri_list;
struct _MINI_XML_NODE *parent, *child, *next;
} MINI_XML_NODE;
公開 API
/* 解析 XML 文件
xml: 文件路徑
buffer: 用戶提供緩衝區,建議大小 ≥ 文件大小 × 2
buffer_len: 緩衝區大小
error_reason: 錯誤信息輸出(128 字節)
root: 輸出根節點
返回:0 成功,-1 失敗
*/
int mini_parse_xml(char *xml, char *buffer, int buffer_len,
char error_reason[128], MINI_XML_NODE **root);
/* 查找子節點 */
int mini_find_child(MINI_XML_NODE *father, char *name, MINI_XML_NODE **child);
/* 查找屬性值 */
int mini_find_attribute(MINI_XML_NODE *node, char *name, char **value);
/* 調試列印樹結構 */
int mini_print_tree(MINI_XML_NODE *root, int layer);
解析算法
- EBNF 文法 定義 XML 子集語法。
- DFA 狀態機 跳過註釋
<!-- ... -->。
- 遞歸下降:
parse_element → parse_attributes → parse_content → parse_child_elements。
- 所有字符串指針直接指向緩衝區內原始文本(修改終止符 \0 分割),零拷貝。
適用場景
- 嵌入式設備配置文件解析(如路由器、IoT 閘道)。
- 記憶體受限系統(< 1MB RAM)需解析小型 XML(< 100KB)。
- 靜態鏈接到固件,無動態加載依賴。