ReadXmlxml 文件讀寫插件
本插件實現(xiàn)對xml文件的讀寫,此版本只實現(xiàn)對標(biāo)準(zhǔn)xml文檔的標(biāo)簽,標(biāo)簽屬性,標(biāo)簽值,預(yù)定義的實體引用進(jìn)行處理。由C語言實現(xiàn),較適合處理大型xml文檔,處理速度較快。本插件遵循GPL協(xié)議。
術(shù)語
開始標(biāo)簽:xml中一個標(biāo)簽對的開始的標(biāo)簽。 結(jié)束標(biāo)簽:xml中一個標(biāo)簽對的結(jié)束的標(biāo)簽。 值內(nèi)存池:專門用于存儲值的內(nèi)存。 行Buffer:存儲讀取xml文件一行內(nèi)容的內(nèi)存。 空白字符:本程序中只代表文本中的空格,tab鍵值兩個非可見字符 標(biāo)簽名:略。 標(biāo)簽屬性:略。 標(biāo)簽屬性值:略。 標(biāo)簽值:略。 注:為敘述方便,下文中,標(biāo)簽名以key,標(biāo)簽屬性以property,標(biāo)簽屬性值以property_value,標(biāo)簽值以value表示。
文件
read_xml.h -- read_xml頭文件
read_xml.c -- read_xml源碼
ReadMe.md -- read_xml說明文檔
xml.xml -- 示例xml文件
libread_xml.so -- 封裝的linux動態(tài)庫
read_xml.lib -- VisualStudio2015生成的windows編譯動態(tài)庫接口
read_xml.dll -- 封裝的windows動態(tài)庫
test.c --示例
處理限制
1.文本限制
單個標(biāo)簽自身(無論是開始標(biāo)簽還是結(jié)束標(biāo)簽)不能跨行。
xml文件頭中xml版本和字符集信息中的空格不做處理。
開始標(biāo)簽的第一個屬性與標(biāo)簽名之間必須有一個或多個空白字符。
值中間和結(jié)尾的空白字符鍵默認(rèn)保留,而值開頭的空白字符將被刪除。
標(biāo)準(zhǔn)的引用:< > & ' " 。一個引用之中不能有空白字符,否則做普通字符處理。
value與開始標(biāo)簽之間的空格或tab鍵值默認(rèn)不存儲為值的一部分,但值與結(jié)束標(biāo)簽之間的空格或tab鍵值默認(rèn)作為值的一部分。
不驗證xml的合法性。雖然程序已經(jīng)盡可能的提高容錯性,但請使用者自行盡可能地保證所讀寫的xml符合規(guī)范,不規(guī)范的xml不保證能正確處理。
2.數(shù)值限制
值內(nèi)存池:5M——整個文檔標(biāo)簽的值,每個值字符串附加一個'\0'字符。合計最大為5M。
行Buffer大小:1024 byte。
標(biāo)簽名:<=127 byte。
屬性名:<=63 byte。
屬性值:<=63 byte。
標(biāo)簽值:理論上單個標(biāo)簽值的大小為值內(nèi)存池大小,但也受行Buffer大小的限制。即值可以跨行,但該值的每一行字符數(shù)應(yīng)<=1024個字符。
存儲方法
存儲內(nèi)容:標(biāo)簽名,屬性名,屬性值,值。
存儲結(jié)構(gòu):伸展樹,雙向鏈表。
伸展樹
存儲xml內(nèi)容,但不體現(xiàn)xml的從屬結(jié)構(gòu)。結(jié)點為KeyNode,以key檢索元素。xml主體中所有同名標(biāo)簽下的所有property,property_value,value都以雙向鏈表的形式存儲在同一個KeyNode下的properties,values。
伸展樹由靜態(tài)全局變量LABEL_TREE管理,其中LABEL_TREE->root指向伸展樹的根節(jié)點。
XML_LIST
不存儲xml內(nèi)容,但體現(xiàn)xml的從屬結(jié)構(gòu)。XML_LIST,以及XML_LIST中是一個雙向鏈表,結(jié)點為XML,每個結(jié)點代表xml文本中的一個標(biāo)簽及其子標(biāo)簽整體,其子標(biāo)簽存儲在child_list中,也是雙向鏈表。XML_LIST自身并不存儲任何xml元素,只引用自伸展樹。
XML_LIST的頭節(jié)點為靜態(tài)全局變量XML_LIST。
此外,伸展樹結(jié)點中的標(biāo)簽屬性、值的鏈?zhǔn)酱鎯σ矠殡p向鏈表。
關(guān)于存儲結(jié)構(gòu)的詳細(xì)信息請參看read_xml.h文件。
使用方法
源碼編譯
源碼中不涉及C99特征,因read_xml屬于插件范疇,故read_xml以動態(tài)庫的形式呈現(xiàn),所以read_xml.c中并沒有主函數(shù),且原則上只對外提供非static修飾的函數(shù)。用戶可自己編譯,文檔結(jié)構(gòu)十分簡單,只有一個.c文件和一個同名的.h文件。用戶可自行對read_xml.h中的一些宏,主要是針對各種Buffer的大小進(jìn)行配置。函數(shù)調(diào)用
請參考read_xml.h文件對各個函數(shù)的說明。
