由於須要用,因此才翻譯了這個文檔。但總歸賴於英語水平頗有限,翻譯出來的中文有可能會詞不達意。
html
開頭先放一波福利給你們數組
【點擊領取】阿里雲代金券 | 阿里雲優惠券 |阿里雲優惠碼|雲服務器|阿里雲|阿里雲代金券 – 限時領取1888元阿里雲代金券
服務器
【3折購買ECS服務器入口】:https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=t9686fzw數據結構
什麼是expat?
expat是一個庫,用c實現的,用來解析XML文檔。它是開源Mozilla工程的基本XML解析器,perl的XML::Parser以及其餘開源的XML解析器。在(做者的)benchmark article中有展現。它有很高的可信度、魯棒性和正確性。
這個庫是James Clark建立的,他還建立了groff、jade、XP和XT。James同時仍是在W3的XML撰寫XML規格的工做小組中的技術Leader。從ftp://ftp.jclark.com/pub中的大多數包都是可用的,包括expat。還有一個test version,這是一個新特點,可是它和non-test version同樣,都很健壯。這篇文章是基於test version而寫的,版本是19990709
expat的概述:
expat是一個流導向(stream-oriented)的解析器。咱們向解析器註冊callback函數,而後開始傳入被解析文檔。對於解析器可以識別的文檔部分,它會調用適當的handler解析那部分(若是你註冊了的話)。被解析文檔是分塊傳給解析器的,所以在你所有傳入文檔以前就開始解析。它同時還容許解析很大的文檔,儘管這個文檔不能徹底放入整個內存。
expat是很驚人的,由於你可以設定不少種的handler和選項。可是你只須要四個函數就能作80%你想作的事兒。
XML_ParserCreate
建立一個新的解析器對象
XML_SetElementHandler
爲開始和結束標籤(tags)設置handler
XML_SetCharacterDataHandler
給字符串設置handler
XML_Parse
傳送一個裝滿文檔信息的buffer給解析器
這些函數和其餘的函數在這個篇文章的參考部分都有描述。參考部分同時還詳細描述了參數傳送給不一樣類型的handlers.
這個壓縮文件(zip file)裏邊包含這篇文章裏邊做爲例子使用的makefile文件和源代碼文件
讓咱們來看一個很是簡單的示例程序,這段程序只使用了上邊的三個函數。(它不須要設置字符串handler。)outline.c這個程序打印了一個元素(element)輸出行,縮進的子元素(child elements)須要從包含他們的父元素(parent element)中區別出來。start handler完成了全部的工做,它給祖先元素(ancestot elements)的每個層次打印兩個縮進的空格,而後打印元素(element)和屬性信息。最後自加加全局變量Depth。函數
int Depth;
void
start(void *data, const char *el, const char **attr) {
int i;
for (i = 0; i < Depth; i++)
printf(" ");
printf("%s", el);
for (i = 0; attr[i]; i += 2) {
printf(" %s='%s'", attr[i], attr[i + 1]);
}
printf("\n");
Depth++;
} /* End of start handler */
ui
end 函數簡單的作着記錄工做,自減減Depth變量
void
end(void *data, const char *el) {
Depth--;
} /* End of end handler */
在建立了解析器之後,主函數將文檔放進解析器,使解析器可以開始它的工做。
阿里雲
Building expat
使用expat的一個困擾是沒有做爲庫的包,取而代之的是有四個分離的object files,咱們不得不把他們連接到咱們的應用程序。這個makefile能編譯這篇文章裏邊介紹的簡單的應用,能夠做爲一個模板。
編碼
XML_NS
給詞語檢查命名空間
XML_BYTE_ORDER
對於小端對齊機器,給它設置「12」(機器對於第一字節有重要性最低),對於大端對齊機器,給它設置「21」(第一字節重要性最高)
XML_MIN_SIZE
使解析器比較小,通常的,運行也將比較慢
若是你的系統沒有memmove函數,可是有bcopy函數,這種狀況下,你將想要有一個宏,可以用bcopy從新定義memmove。有一個makefile宏可以實現這個功能,XP_MM。爲了消除它的影響,你將不得不對於它的定義取消註釋。
spa
void
init_info(Parseinfo *info) {
info->skip = 0;
info->depth = 1;
/* Other initializations here */
} /* End of init_info */翻譯
void
rawstart(void *data, const char *el, const char **attr) {
Parseinfo *inf = (Parseinfo *) data;
if (! inf->skip) {
if (should_skip(inf, el, attr)) {
inf->skip = inf->depth;
}
else
start(inf, el, attr); /* This does rest of start handling */
}
inf->depth++;
} /* End of rawstart */
void
rawend(void *data, const char *el) {
Parseinfo *inf = (Parseinfo *) data;
inf->depth--;
if (! inf->skip)
end(inf, el); /* This does rest of end handling */
if (inf->skip == inf->depth)
inf->skip = 0;
} /* End rawend */
注意上邊的那個例子,在start handler和end handler中,不一樣深度是如何被操做的。end tag handler是start tag handler的鏡像。這是必要的,適當的模型控制。由於,在start tag handler中,咱們在start tag 代碼主體以後增長depth,而後在end handler中,咱們須要在主體以前操做depth。若是咱們決定將增長depth做爲start handler的第一件事情,那麼咱們必須將減小depth做爲end handler的最後一件事情。
爲了可以在不一樣的handlers之間在不使用全局變量的狀況下能傳送信息,咱們須要定義一個數據結構保存住共享的變量。你可以告訴expat傳送這個結構的一個指針給這個handlers。這個是很典型的,對於大多數handlers第一個參數。
當解析器是使用XML_ParserCreateNS建立的時候,expat執行命名空間處理。在命名空間處理中,expat使用xmlns和xmlns:...屬性,在他們發生時,給元素範圍聲明瞭命名空間。這就意味着你的start handler將不會看見這些屬性。你的應用程序經過用XML_SetNamespaceDeclHandler設定命名空間聲明handlers仍然能被他們的聲明通知。
屬於給定命名空間的元素類型和屬性名在擴展形式中被傳送給合適的handler。這個擴展形式是一個命名空間URI的連續,分隔字符(是XML_ParserCreateNS的第二個參數),以及本地名(冒號後的部分)。沒有聲明的名字前綴傳不變的送給handler,前綴和冒號仍然連接着。無前綴的屬性名不會被擴展,無前綴的屬性名只有當他們在缺省的命名空間的範圍的時候被擴展。
你可以使用XML_SetNamespaceDeclHandler函數給命名空間聲明的開始和一個聲明範圍的結束設置handler。StartNamespaceDeclHandler在start標籤handler以前被調用,而且EndNamespaceDeclHandler在對應的結束標籤以前被調用,這個是爲告終束命名空間的範圍。命名空間的開始handler得到傳過來的前綴和URI給命名空間。對於一個缺省的命名空間的定義(xmlns='...'),前綴爲null。在缺省命名空間沒有設定的地方,URI將爲null。命名空間的結束handler得到關閉範圍的前綴。
這些handlers被每個聲明調用。所以若是,例如,一個開始標籤有三個命名空間聲明,那麼StartNamespaceDeclHandler在開始標籤handler被調用以前將會被調用三次,每一次聲明調用一次。
namespace.c這個例子展現使用了這些特性。像outline.c,它生成了一個輸出行,可是另外,當一個命名空間範圍開始和結束的時候,它給出了一個註解。這個例子也展現了使用應用程序的用戶數據。
若是XML是基於Unicode,而且每個XML處理着都須要關注UTF-8和UTF-16(Unicode的一個或者是兩個字節的編碼),其餘的編碼可能在XML文檔或者是實體中被聲明。對於主文檔,一個XML聲明可能會包括一個編碼聲明:
<?xml version="1.0" encoding="ISO-8859-2"?>
外部解析實體可能用一個文本聲明開始,這個看起來像一個XML聲明,可是隻有一個編碼聲明:
<?xml encoding="Big5"?>
對於expat,在建立一個解析器的時候,你可能須要指定一個編碼。當編碼信息可能從一個外部文檔源來的時候,這個是頗有用的(像一個高層次的協議。)
在expat中有四個固定的編碼格式:
* UTF-8
* UTF-16
* ISO-8859-1
* US-ASCII
任何在編碼聲明中被發現,或者是在解析器建立中協議編碼被制定的時候,促使UnknownEncodingHandler被調用。這個handler得到傳過來的編碼名和一個XML_Encoding數據結構的指針。若是它知道怎樣去處理這個編碼格式的話。你的handler要填滿這個結構體而且返回1。不然,這個handler將會返回0。這個handler一樣得到一個選擇應用數據結構的指針。當你設置handler的時候,你可能會指出。
expat在字符編碼上的限制,這個經過填滿XML_Encoding結構體可以支持。包括文件:
1.每個ASCII字符,可以在一個良好形式的XML文檔顯示,必須經過一個單字節被表示,而且這個字節必須與它的ASCII編碼相符(除了$@\^'{}~這些字符)
2.字符必須是使用四字節或者更少的編碼。
3.全部的字符被編碼,必須有Unicode值,小於或者等於65535(0xFFFF),這個不適用於固定支持的UTF-16和UTF-8。
4.沒有字符可能經過更多的一個明顯的字節序列被編碼。
xml_encoding包含一個整數數組對應的第一字節的編碼序列。若是該值在數組中的一個字節是零或正,而後字節是一個單字節編碼,在數組中包含編碼Unicode標量值。A -1在這個數組中指出了一個畸形字節。若是這個值是-二、-3或者是-4,那麼這個字節是各自二、3或4字節序列的開始。多字節序列會被傳送給轉化函數,在XML_Encoding數組中被指出。這個函數會返回序列的Unicode標量值或者是-1,若是這個序列是急性的話。
對於expat使用者,一個隱藏的陷阱要注意。可能會陷入由於expat能夠接受輸入可變的編碼,可是傳給handlers的字符串老是UTF-8編碼。你的應用程序要爲任何字符串轉化爲其餘編碼形式負責。
expat不會直接讀取或者解析外部實體。請注意,任何外部DTD都是外部實體的一個特殊case。若是沒有設置ExternalEntityRefHandler,那麼外部實體參照會被忽略。不然,它會調用你的handler,使用讀取和解析外部實體須要的信息。
你的handler對於解析實體沒有直接關係,可是對於使用XML_ExternalEntityParserCreate建立一個最基本的解析器是有關係的。這個會返回一個XML_Parser實例(instance),這個實例有handlers和其餘從父解析器被初始化的數據結構。你可能接着會使用XML_Parse或者是XML_ParseBuffer調用這個解析器。由於外部實體咱們還會涉及其餘的外部實體,你的handler也許須要準備被遞歸調用。
爲了解析參數實體,當expat被編譯的時候,XML_DTD宏必須被定義。除此之外,建立解析器後,而且開始解析以前,你必須調用XML_SetParamEntityParsing,而且使用下邊的參數:
XML_PARAM_ENTITY_PARSING_NEVER
不解析參數實體或者外部子集
XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
解析參數實體和外部子集,除非standalone在XML定義時被設置爲"yes"。
XML_PARAM_ENTITY_PARSING_ALWAYS
老是解析參數實體和外部子集
爲了可以讀取外部子集,你必須想上邊描述的那樣設置一個外部實體參照handler。
XML_ParserCreate
XML_Parser XML_ParserCreate(const XML_Char*encoding)
建立一個新的解析器,若是encoding爲不爲null,指定一個字符編碼給文檔使用。這個會無視文檔聲明的編碼形式。有四種固定的編碼形式:
US-ASCII
UTF-8
UTF-16
ISO-8859-1
其餘值將會引發UnknownEncodingHandler的調用
XML_ParserCreateNS
XML_Parser XML_ParserCreateNS(const XML_Char*encoding, XML_Char sep)
建立一個新的解析器,這個解析器有命名空間有效的處理。命名空間擴展了元素名和屬性名返回做爲一個連續的命名空間URI、sep、以及本地名字的一部分。這就意味着你應該指定一個字符做爲sep,它不能做爲有效URI的一部分。
XML_ExternalEntityParserCreate
XML_Parser XML_ExternalEntityParserCreate(XML_Parser p, const XML_Char *context, const XML_Char *encoding)
建立一個新的XML_parser對象,解析一個外部實體。上下文是上下文參數傳遞,經過調用一個ExternalEntityRefHandler函數。其餘的狀態信息,譬如handlers、用戶數據、命名空間處理都是從解析器繼承得來的,經過第一個參數傳遞。在這個解析器中,所以你沒有必要去調用任何行爲改變函數(除非你想這個解析器有和父解析器不一樣的行爲)
XML_ParserFree
void XML_ParserFree(XML_Parser p)
釋放解析器使用的內存。你的應用程序負責釋放全部和UserData有關聯的內存。
解析
XML_Parse
int XML_Parse(XML_Parser p, const char *s, int len, int isFinal)
解析文檔。string s是一個buffer,包含文檔的一部分(也許是所有)。s的字節數,也就是文檔的一部分,是由len指出來的。這也就意味着,s爲Null要被終止。同時也意味着,若是len比內存中s所指向的塊字節數大,可能有一個內存錯誤。isFinal參數通知解析器,這是文檔的最後一塊。一般,最後一塊是空(i.e len爲0)。若是出現語法錯誤,返回0。不然返回一個非零的值。
XML_ParseBuffer
int XML_ParseBuffer(XML_Parser p, int len, int isFinal)
這個函數相似XML_Parser,除了在這個函數中,expat提供了buffer。經過從expat的XML_GetBuffer函數得到buffer,應用程序能避免兩次複製輸入。
XML_GetBuffer
void *XML_GetBuffer(XML_Parser p, int len)
得到一個大小爲len的buffer,將文檔的一塊放到這個buffer中。若是expat不能分配足夠的內存空間給buffer,返回NULL值。每一次調用XML_ParseBuffer時,這個函數必須優先被調用。一個典型的使用就像這樣:
for (;;) {
int bytes_read;
void *buff = XML_GetBuffer(p, BUFF_SIZE);
if (buff == NULL) {
/* handle error */
}
bytes_read = read(docfd, buff, BUFF_SIZE);
if (bytes_read < 0) {
/* handle error */
}
if (! XML_ParseBuffer(p, bytes_read, bytes_read == 0)) {
/* handle parse error */
}
if (bytes_read == 0)
break;
}
handler設定
雖然一般handlers設置在解析以前,而且是單獨的。可是一個應用程序可能選擇設置或者更改這個正在進展的解析事件的handler。例如,你的應用程序也許會選擇忽略全部的文本,不是起源於同一個**元素(a para element)。一種方式是當開始標籤被看見的時候設置字符handler,而且不設定和它對應的結束標籤(end tag)。
一個handler也能夠不設定,經過提供一個空指針給設定handler的函數。設置handler爲空的函數有返回值。
你的handlers將會須要傳入字符串,經過XML_char類型的數組。這個類型定義在xmlparse.h,而且有條件設定是XML_UNICODE宏中的任意一個。若是一個也沒有設定,那麼XML_char包含的字符就是UTF_8編碼。不然你將須要傳入UTF_16當形式是unsigned short或者是wchar_t字符的時候。
請注意,你將會收到文檔的最初編碼的形式不支持。在這個文檔的其餘地方,關於這一點我可能簡單的說起UTF_8。
XML_SetElementHandler
XML_SetElementHandler(XML_Parser p,
XML_StartElementHandler start,
XML_EndElementHandler end);
typedef void
(*XML_StartElementHandler)(void *userData,
const XML_Char *name,
const XML_Char **atts);
typedef void
(*XML_EndElementHandler)(void *userData,
const XML_Char *name);
設置開始和結束標籤的handlers。屬性經過一個char類型的向量指針被傳給開始handlers。每個屬性在start標籤的這個向量中佔據2個連續的空間:屬性名跟隨着屬性值。若是有空指針,這兩個handlers都終止。
XML_SetCharacterDataHandler
XML_SetCharacterDataHandler(XML_Parser p,
XML_CharacterDataHandler charhndl)
typedef void
(*XML_CharacterDataHandler)(void *userData,
const XML_Char *s,
int len);
設置一個文本handler。你的handler接受到的這個字符串不是空,不然終止。你須要使用長度參數去處理字符串的結束。單個相鄰的文本塊將致使連續的調用到這個handler。換句話說,若是在一個文本總搜尋一個模板,可能會被分裂交叉的調用這個handler。
XML_SetProcessingInstructionHandler
XML_SetCommentHandler
XML_SetCdataSectionHandler
XML_SetCdataSectionHandler(XML_Parser p,
XML_StartCdataSectionHandler start,
XML_EndCdataSectionHandler end)
typedef void
(*XML_StartCdataSectionHandler)(void *userData);
typedef void
(*XML_EndCdataSectionHandler)(void *userData);
設置得到調用一個CDATA段的開始和結束處理的handlers
XML_SetDefaultHandler
XML_SetDefaultHandler(XML_Parser p,
XML_DefaultHandler hndl)
typedef void
(*XML_DefaultHandler)(void *userData,
const XML_Char *s,
int len);
設置一個處理文檔中全部不能被處理的字符的handler。這個既包括沒有設置handler不能被處理的字符(像一些DTD聲明的類型),也包括那些可以被描述的數據,可是他們當前沒有設定handler。請注意,一個連續的數據塊,是註定要被描述的,默認的handler可能實際上會被調用屢次。給這個函數設置handler有反作用,會關閉內部定義的實體的參考的擴展。
XML_SetDefaultHandlerExpand
XML_SetDefaultHandlerExpand(XML_Parser p,
XML_DefaultHandler hndl)
設置一個缺省handler,可是不影響內部實體定義的擴展。
XML_SetExternalEntityRefHandler
XML_SetExternalEntityRefHandler(XML_Parser p,
XML_ExternalEntityRefHandler hndl)
typedef int
(*XML_ExternalEntityRefHandler)(XML_Parser parser,
const XML_Char *context,
const XML_Char *base,
const XML_Char *systemId,
const XML_Char *publicId);
設置一個擴展實體定義的handler。這個handler同會被處理外部擴展DTD子集的處理調用,若是參數實體解析有效的話。(參看XML_SetParamEntityParsing)
base:用於系統標識符,被XML_SetBase設定,有可能爲NULL
publicId: 在實體聲明的時候被賦值,有可能爲NULL
systemId: 系統標識符,實體聲明時指定,確定不爲NULL
這個handler有多個方面與其餘的handlers不一樣。首先,這個handler返回一個整數。若是成功進行了擴展實體定義的處理則一個非零的值被返回。返回零標識出錯,而且導致調用的解析器返回一個XML_ERROR_EXTERNAL_ENTITY_HANDLING的錯誤。
第二,取代了第一個參數爲userData,它面對實體定義時從解析器得到。這樣,接下來的上下文參數,能夠做爲參數去調用XML_ExternalEntityParserCreate。使用被返回的解析器,外部實體的主體能被遞歸解析。由於這個handler可能被遞歸,所以不該該將信息保存到全局變量或靜態變量。
XML_SetUnknownEncodingHandler
XML_SetUnknownEncodingHandler(XML_Parser p,
XML_UnknownEncodingHandler enchandler,
void *encodingHandlerData)
typedef int
(*XML_UnknownEncodingHandler)(void *encodingHandlerData,
const XML_Char *name,
XML_Encoding *info);
設置一個handler去處理編碼區別於固定的設定。若是handler知道怎樣去處理被給出的名字的編碼,它將填滿信息數據結構體而且返回1。不然返回0。
typedef struct {
int map[256];
void *data;
int (*convert)(void *data, const char *s);
void (*release)(void *data);
} XML_Encoding;
map數組包括爲每個在字節序列中的主要的字節信息。若是相同的值是>=0,它是一個單字節序列而且字節編碼是Unicode編碼。若是值是-1,那麼那個字節在序列中做爲起始字節是無效的。若是值是-n,這裏的n是一個整數值>1,那麼n是序列中的字節數而且實際上轉化已經經過convert指向的那個函數完成。若是這個序列自身無效的話這個函數可能返回-1。若是隻要單一字節編碼,那麼這個convert指針有可能爲null。data參數給convert函數傳送XML_Encoding的數據指針。字符串s非空而且指向的字節序列被轉化。
當它完成編碼的時候,這個函數指向release,被解析器調用。它可能爲null。
XML_SetNamespaceDeclHandler
XML_SetNamespaceDeclHandler(XML_Parser p,
XML_StartNamespaceDeclHandler start,
XML_EndNamespaceDeclHandler end)
typedef void
(*XML_StartNamespaceDeclHandler)(void *userData,
const XML_Char *prefix,
const XML_Char *uri);
typedef void
(*XML_EndNamespaceDeclHandler)(void *userData,
const XML_Char *prefix);
給命名空間聲明設定handler。命名空間聲明發生在start標籤(start tags)內。可是命名空間聲明開始handler在開始標籤handler中已經被聲明的每個命名空間以前被調。對應的命名空間的結束handler在命名空間被關聯的元素結束標籤以後被調。
XML_SetUnparsedEntityDeclHandler
XML_SetUnparsedEntityDeclHandler(XML_Parser p,
XML_UnparsedEntityDeclHandler h)
typedef void
(*XML_UnparsedEntityDeclHandler)(void *userData,
const XML_Char *entityName,
const XML_Char *base,
const XML_Char *systemId,
const XML_Char *publicId,
const XML_Char *notationName);
設置一個接受沒有被解析的實體的聲明的handler。有實體聲明的都有一個標記:
<!ENTITY logo SYSTEM "images/logo.gif" NDATA gif>
針對上邊的例子,實體名爲「logo」,systemId是「images/logo.gif」而且標記名爲「gig」。對於這個例子,publicId參數爲Null。base參數爲XML_SetBase設置的內容。若是沒有設置,那麼爲null。
XML_SetNotationDeclHandler
XML_SetNotationDeclHandler(XML_Parser p,
XML_NotationDeclHandler h)
typedef void
(*XML_NotationDeclHandler)(void *userData,
const XML_Char *notationName,
const XML_Char *base,
const XML_Char *systemId,
const XML_Char *publicId);
設置接受標記聲明的handler
XML_SetNotStandaloneHandler
XML_SetNotStandaloneHandler(XML_Parser p,
XML_NotStandaloneHandler h)
typedef int
(*XML_NotStandaloneHandler)(void *userData);
設置一個handler,若是文檔不是「standalone」,就被調用。這個發生在當有一個外部子集或者是有一個針對參數實體的關聯,可是在xml聲明時,沒有給"standalone"設置爲「yes」。若是這個handler返回0,那麼這個解析器將拋出一個XML_ERROR_NOT_STANDALONE的錯誤。
解析位置和錯誤報告函數
當解析函數返回0的時候,有一些函數你可能想去調,由於對於一些錯誤,報告錯誤位置的函數是挺有用的。位置報告是字符串序列生成的第一個當前事件(或者說,錯誤是致使解析函數返回0的緣由。)
XML_GetErrorCode
enum XML_Error XML_GetErrorCode(XML_Parser p)
返回發生了那種類型的錯誤
XML_ErrorString
const XML_LChar *XML_ErrorString(int code)
返回一個字符串,描述對應code的錯誤。這個code是一個枚舉值,可以從XML_GetErrorCode中被返回。
XML_GetCurrentByteIndex
long XML_GetCurrentByteIndex(XML_Parser p)
返回位置的偏移字節。
XML_GetCurrentLineNumber
int XML_GetCurrentLineNumber(XML_Parser p)
返回位置的行號。
XML_GetCurrentColumnNumber
int XML_GetCurrentColumnNumber(XML_Parser p)
返回偏移,從當前行的開始位置。
Miscellaneous functions
這些函數在這部分,或者能從解析器得到狀態信息,或者能被使用來動態設置解析器選項。
XML_SetUserData
XML_SetUserData(XML_Parser p, void *userData)
設置用戶數據指針,得到的傳送給handlers。
XML_GetUserData
void * XML_GetUserData(XML_Parser p)
返回用戶數據指針,得到的傳送給handlers。它其實是用一個宏實現的
XML_UseParserAsHandlerArg
void XML_UseParserAsHandlerArg(XML_Parser p)
這個被調用之後,在userData參數中,handlers得到解析器。使用上邊的XML_GetUserData函數,userData信息可以一直被得到。
XML_SetBase
int XML_SetBase(XML_Parser p, const XML_Char *base)
設置base,這個base被用來解決在系統標識符中依賴URIs。若是沒有內存存儲base,返回0,不然返回非0。
XML_GetBase
const XML_Char * XML_GetBase(XML_Parser p)
返回base,爲了解決URIs依賴
XML_GetSpecifiedAttributeCount
int XML_GetSpecifiedAttributeCount(XML_Parser p)
當屬性被記錄到starthandler的atts向量(the atts vector)中的時候,屬性確定被設定在元素中,全部屬性從ATTLIST申明的缺省信息中得到他們的值。這個函數返回屬性數,屬性數確定被設置了,所以給出缺省設置的針對第一個屬性的偏移。它提供信息給最後調用的start handler。若是你在start handler中,那麼意味着當前調用。
XML_SetEncoding
int XML_SetEncoding(XML_Parser p, const XML_Char *encoding)
設置被解析器使用的編碼(encoding)。這個與給建立解析器的函數傳入一個非空的encoding參數是等效的。它不能在XML_Parser後被調用或者是XML_ParseBuffer在解析器中已經被調用。
XML_SetParamEntityParsing
int XML_SetParamEntityParsing(XML_Parser p, enum XML_ParamEntityParsing code)
若是解析器不在XML_DTD被設置的時候編譯,那麼這個函數返回0.不然返回1而且容許參數實體的解析,包括在外部DTD子集的外部參數實體。根據代碼,給代碼的選擇是:
* XML_PARAM_ENTITY_PARSING_NEVER
* XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
* XML_PARAM_ENTITY_PARSING_ALWAYS
若是以爲有用,請給小弟點個贊👍,之後會給你們帶更多幹貨!
雲服務要領代金券買纔有優惠!
【點擊領取】阿里雲代金券 | 阿里雲優惠券 |阿里雲優惠碼|雲服務器|阿里雲|阿里雲代金券 – 限時領取1888元阿里雲代金券
【3折購買ECS服務器入口】:https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=t9686fzw