首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言輕量級 XML 解析器:無動態分配、遞歸下降、嵌入式友好

     編輯:關於C語言

設計目標

  • 零動態記憶體分配:解析前預分配緩衝區,樹節點直接在緩衝區內構建,無碎片,適合無 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)。
  • 靜態鏈接到固件,無動態加載依賴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved