1. 程式人生 > >xml檔案解析--libxml2庫函式解釋

xml檔案解析--libxml2庫函式解釋


本指南中的例子程式碼示範如何做到: 
• 解析文件 
• 取得指定元素的文字 
• 新增一個元素及它的內容 
• 新增一個屬性 
• 取得一個屬性的值 
例子的完整程式碼包含在附錄中 
  
資料型別 
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”是在這個指南中使用文件的根型別。 
  
取得元素內容 
  
你找到在文件樹中你要查詢的元素後可以取得它的內容。在這個例子中我們查詢“story”元素。程序將在冗長的樹中查詢我們感興趣的元素。我們假定期你已經有了一個名為doc的xmlDocPtr和一個名為cur的xmlNodPtr。 
①cur = cur->xmlChildrenNode; 
②while (cur != NULL) {   
if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){ 
parseStory (doc, cur); 

cur = cur->next; 

  
①取得cur的第一個子結點,cur指向文件的根,即“story”元素。 
②這個迴圈迭代通過“story”的子元素查詢“storyinfo”。這是一個包含有我們將查詢的“keywords”的元素。它使用了字串比較函式xmlStrcmp。如果相符,它呼叫函式parseStory。 
  
void 
parseStory (xmlDocPtr doc, xmlNodePtr cur) { 
xmlChar *key; 
① cur = cur->xmlChildrenNode; 
②while (cur != NULL) { 
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) { 
③ key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 
printf("keyword: %s\n", key); 
xmlFree(key); 

cur = cur->next; 

return; 

① 再次取得第一個子結點。 
② 像上面那個迴圈一樣,我們能過迭代,查詢我們感興趣的叫做“keyword”的元素。 
③ 當我們找到元素“keyword”時,我們需要列印它包含在XML中的記錄的內容,文字被包含於元素的子結點中,因此我們藉助了cur->xmlChildrenNode,為了取得文字,我們使用函式xmlNodeListGetString,它有一個文件指標引數,在這個例子中,我們僅僅列印它。 
註釋 
因為xmlNodeListGetString為它返回的字串分配記憶體,你必須使用xmlFree釋放它。 
  
使用XPath取得元素內容
除了一步步遍歷文件樹查詢元素外,包含支援使用Xpath表示式取得指定結點集。完整的Xpath API文件在這裡。Xpath允許通過路徑文件搜尋匹配指定條件的結點。在下面的例子中,我們搜尋文件中所有的“keyword”元素。 
  
註釋 
下面是Xpath完整的討論。它詳細的使用資料,請查閱Xpath規範。 
這個例子完整的程式碼參見附錄D,XPath例程程式碼。 
Using XPath requires setting up an xmlXPathContext and then supplying the XPath expression and the context to the xmlXPathEvalExpression

相關推薦

xml檔案解析--libxml2函式解釋

本指南中的例子程式碼示範如何做到:  • 解析文件  • 取得指定元素的文字  • 新增一個元素及它的內容  • 新增一個屬性  • 取得一個屬性的值  例子的完整程式碼包含在附錄中     資料型別 Libxml定義了許多資料型別,我們將反覆碰到它們,它隱藏了雜亂的來源以致你不必處理它除非你有特定的需要

C++讀寫XML檔案libxml2

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

tomcat server.xml檔案以及虛擬主機的解釋(精華~)

轉自:http://blog.csdn.net/liuxuejin/article/details/9104055   基於以下說法的領悟: 若只配appBase,不配Context 的docBase(appBase和docBase二選一就可以了),則appBase的每個資料夾

Android7.1 [Camera] cam_board.xml 檔案解析原始碼分析(一)

        原始碼平臺:rk3399           RK支援了很多個攝像頭,在驅動目錄hardware/rockchip/camer

ini檔案解析c(iniparser)

github:https://github.com/ndevilla/iniparser 原文地址: http://blog.csdn.net/orz415678659/article/details/9533259 一.交叉編譯ini解析庫 下載iniparser-3.1.tar.gz 2

技術總結:XML檔案解析

近期整理了以前的程式碼,將XML檔案的解析程式碼程式設計了一個工具。通過Document類得到一個NodeList,遍歷其得到標籤,通過標籤得到XML檔案的內容。利用抽象方法提供給使用者處理檔案的介面。程式碼如下: /* * @auther yc * 2018/10/1

Linux C高階程式設計——檔案操作之函式

Linux C高階程式設計——檔案操作之庫函式 宗旨:技術的學習是有限的,分享的精神是無限的 ——為什麼要設計標準I/O庫? 直接使用API進行檔案訪問時,需要考慮許多細節問題 例如:read、write時,緩衝區的大小該如何確定,才能使效率最優 標準I/O庫封裝了諸多

struts2中struts.xml和web.xml檔案解析及工作原理

web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmln

xml檔案解析—DOM方式

1:xml檔案<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>豬1戒</name>

JAVA以及JSP中讀取XML檔案(解析及路徑問題)

    在系統開發過程中,從配置檔案中讀取配置資訊是每一個系統必須具備的功能,例如,我們要配置讀取資料庫配置資訊,包括驅動程式名、連線字串,使用者名稱,口令等資訊,由於這些資訊會隨著使用者的不同而發生

Java 操作xml檔案的dom4J使用

XML簡介 什麼是xml? XML 指可擴充套件標記語言(EXtensible Markup Language) XML 是一種標記語言,很類似 HTML XML 的設計宗旨是傳輸資料,而非顯示資料 XML 標籤沒有被預定義。您需要自行定義標籤。 XM

xml檔案解析-dom4j解析

1 package cn.sxt.day0105.dom4j; 2 3 import java.io.File; 4 import java.util.Iterator; 5 6 import org.dom4j.Attribute; 7 import org.dom4j.Docume

libxml2函式詳解

許多事物符合80/20法則,libxml中也是20%的函式提供了80%的功能。下面的列表列出了libxml的主要函式及其用法說明。 1.   全域性函式說明 標頭檔案引用 xml2config --cflags 庫檔案引用 xml2config -

java反射與xml檔案解析

    在專案開發的過程中,遇到了要將日誌匯出為xml格式和將xml匯入到日誌資料庫中的功能需求,因為專案中存在多種日誌形式(這聽起來很奇葩是不是?),我實在懶得為每一種日誌都寫一個方法。想到在開始的設計過程中,將每種的日誌都對映為一個pojo,故想到了java的反射機制,

linux檔案程式設計-C函式使用以及時間程式設計

linux檔案程式設計-C庫函式使用 檔案的建立: FILE *fopen(const char *PATHname,const char *mode) 檔案的讀取: SIZE_t fread(void *ptr,size_t size,size_t n,FILE *str

xml檔案解析的幾種方式(一)

常見的幾種解析xml檔案的方式 XML的解析方式有很多,光開源的就有十多種:如Xerces、JDOM、DOM4J、XOM、JiBX、KXML、XMLBeans、jConfig、XStream、XJR等。 但是最常用的還是sax,dom,pull,dom4j 而androi

XML檔案解析--xpath技術

最近用到xml檔案解析,剛開始竟然忘了xpath,一股腦不斷的用各種for,for,for迴圈遍歷,還在想break來減少迴圈…,寫得差不多的時候覺得很不對勁,終於想到xpath(我不是菜鳥,我是小菜鳥…)。先了解下皮毛吧,記錄一下。 一、Element(元素

簡單看Spring原始碼--對xml檔案解析

Spring如何解析xml配置檔案? xml配置檔案是Spring中極其重要的一部分,讓我們一起看一下spring解析xml檔案的。 以下是一段簡單的通過類路徑下的test.xml檔案載入bean獲得BeanFactory的程式碼: BeanFac

MyBatis(一) xml檔案解析流程 Configuration

1.Configuration <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Co

C語言檔案操作標準函式與Linux系統函式效率比較

我們都知道,C語言在UNIX/Linux系統下有一套系統呼叫(系統函式),比如檔案操作open()、close()、write()、read()等,而標準C語言的庫函式中也有一套對檔案的操作函式fopen()、fclose()、fwrite()、fread()等