本專案實作一個基於 C 語言的輕量級 XML 編解碼器,專為嵌入式系統與資源受限環境設計。編解碼器支援標準 XML 1.0 規範的核心子集,包含元素巢狀、屬性解析、字元實體轉義、CDATA 區段處理等功能,同時透過記憶體池與流式解析技術,將執行期記憶體佔用降至最低。
+------------------+ +------------------+ +------------------+
| 輸入層 |---->| 詞法分析器 |---->| 語法分析器 |
| (檔案/網路/記憶體)| | (Tokenizer) | | (Parser) |
+------------------+ +------------------+ +------------------+
|
v
+------------------+
| 事件分發/樹建構 |
| (Handler/Builder) |
+------------------+
git clone https://github.com/example/lightxml.git
cd lightxml
mkdir build && cd build
cmake .. && make
sudo make install
#include "lightxml.h"
void on_start_element(void *ctx, const char *name, const char **atts) {
printf("開始元素: %s\n", name);
for (int i = 0; atts[i]; i += 2) {
printf(" 屬性: %s = %s\n", atts[i], atts[i+1]);
}
}
void on_end_element(void *ctx, const char *name) {
printf("結束元素: %s\n", name);
}
void on_char_data(void *ctx, const char *data, int len) {
printf("字元資料: %.*s\n", len, data);
}
int main() {
XML_Parser parser = XML_ParserCreate(NULL);
XML_SetElementHandler(parser, on_start_element, on_end_element);
XML_SetCharacterDataHandler(parser, on_char_data);
const char *xml = "- Hello
";
XML_Parse(parser, xml, strlen(xml), 1);
XML_ParserFree(parser);
return 0;
}
| 測試項目 | 本專案 | libxml2 | Expat |
|---|---|---|---|
| 解析 10MB XML (ms) | 45 | 62 | 58 |
| 峰值記憶體 (MB) | 3.2 | 12.5 | 8.7 |
| 二進制大小 (KB) | 85 | 1,200 | 210 |
歡迎開發者回報 Issue、提交 PR,共同完善這個輕量級 XML 解決方案。