Libxml是一個實現讀、創建及操縱XML數據功能的C語言庫。這個指南提供例子代碼並給 出它基本功能的解釋。在這個項目的主頁上有Libxml及更多關於它可用的資料。包含有完整的API文檔。這個指南並不能替代這些完整的文檔,但是闡明功 能需要使用庫來完成基本操作。
這個指南基於一個簡單的XML應用,它使用我寫的一篇文章生成,它包含有元數據和文章的主體。
本指南中的例子代碼示范如何做到:
? 解析文檔
? 取得指定元素的文本
? 添加一個元素及它的內容
? 添加一個屬性
? 取得一個屬性的值
例子的完整代碼包含在附錄中
數據類型
Libxml定義了許多數據類型,我們將反復碰到它們,它隱藏了雜亂的來源以致你不必處理它 除非你有特定的需要。xmlChar 替代char,使用UTF-8編碼的一字節字符串。如果你的數據使用其它編碼,它必須被轉換到UTF-8才能使用libxml的函數。在libxml編碼 支持WEB頁面有更多關於編碼的有用信息。
XmlDoc 包含由解析文檔建立的樹結構,xmlDocPtr是指向這個結構的指針。
xmlNodePtr and xmlNode 包含單一結點的結構xmlNodePtr是指向這個結構的指針,它被用於遍歷文檔樹。
解析文檔
解析文檔時僅僅需要文件名並只調用一個函數,並有錯誤檢查。完整代碼:附錄C, Keyword例程代碼
①xmlDocPtr doc;
②xmlNodePtr cur;
③doc = xmlParseFile(docname);
④if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return;
}
⑤cur = xmlDocGetRootElement(doc);
⑥if (cur == NULL) {
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
return;
}
⑦if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
fprintf(stderr,"document of the wrong type, root node != story");
xmlFreeDoc(doc);
return;
}
①定義解析文檔指針。
②定義結點指針(你需要它為了在各個結點間移動)。
④檢查解析文檔是否成功,如果不成功,libxml將指一個注冊的錯誤並停止。
注釋
一個常見錯誤是不適當的編碼。XML標准文檔除了用UTF-8或UTF-16外還可用其它編碼保存。如果文檔是這樣,libxml將自動地為你轉換到UTF-8。更多關於XML編碼信息包含在XML標准中。
⑤取得文檔根元素
⑥檢查確認當前文檔中包含內容。
⑦在這個例子中,我們需要確認文檔是正確的類型。“Story”是在這個指南中使用文檔的根類型。