詳解netty中常用的xml編碼解碼器_第1頁
詳解netty中常用的xml編碼解碼器_第2頁
詳解netty中常用的xml編碼解碼器_第3頁
詳解netty中常用的xml編碼解碼器_第4頁
詳解netty中常用的xml編碼解碼器_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第詳解netty中常用的xml編碼解碼器目錄簡介XmlFrameDecoderXmlDecoder總結(jié)

簡介

在json之前,xml是最常用的數(shù)據(jù)傳輸格式,雖然xml的冗余數(shù)據(jù)有點(diǎn)多,但是xml的結(jié)構(gòu)簡單清晰,至今仍然運(yùn)用在程序中的不同地方,對于netty來說自然也提供了對于xml數(shù)據(jù)的支持。

netty對xml的支持表現(xiàn)在兩個(gè)方面,第一個(gè)方面是將編碼過后的多個(gè)xml數(shù)據(jù)進(jìn)行frame拆分,每個(gè)frame包含一個(gè)完整的xml。另一方面是將分割好的frame進(jìn)行xml的語義解析。

進(jìn)行frame拆分可以使用XmlFrameDecoder,進(jìn)行xml文件內(nèi)容的解析則可以使用XmlDecoder,接下來我們會詳細(xì)講解兩個(gè)decoder實(shí)現(xiàn)和使用。

XmlFrameDecoder

因?yàn)槲覀兪盏降氖菙?shù)據(jù)流,所以不確定收到的數(shù)據(jù)到底是什么樣的,一個(gè)正常的xml數(shù)據(jù)可能會被拆分成多個(gè)數(shù)據(jù)frame。

如下所示:

+-------+-----+--------------+

|this|IsA|XMLElement/|

+-------+-----+--------------+

這是一個(gè)正常的xml數(shù)據(jù),但是被拆分成為了三個(gè)frame,所以我們需要將其合并成為一個(gè)frame如下:

+-----------------+

|thisIsAXMLElement/|

+-----------------+

還有可能不同的xml數(shù)據(jù)被分拆在多個(gè)frame中的情況,如下所示:

+-----+-----+-----------+-----+----------------------------------+

|an|Xml|Element/|ro|otchildcontent/child/root|

+-----+-----+-----------+-----+----------------------------------+

上面的數(shù)據(jù)需要拆分成為兩個(gè)frame:

+-----------------+-------------------------------------+

|anXmlElement/|rootchildcontent/child/root|

+-----------------+-------------------------------------+

拆分的邏輯很簡單,主要是通過判斷xml的分隔符的位置來判斷xml是否開始或者結(jié)束。xml中的分隔符有三個(gè),分別是,和/。

在decode方法中只需要判斷這三個(gè)分隔符即可。

另外還有一些額外的判斷邏輯,比如是否是有效的xml開始字符:

privatestaticbooleanisValidStartCharForXmlElement(finalbyteb){

returnb='a'b='z'||b='A'b='Z'||b==':'||b=='_';

}

是否是注釋:

privatestaticbooleanisCommentBlockStart(finalByteBufin,finalinti){

returniin.writerIndex()-3

in.getByte(i+2)=='-'

in.getByte(i+3)=='-';

}

是否是CDATA數(shù)據(jù):

privatestaticbooleanisCDATABlockStart(finalByteBufin,finalinti){

returniin.writerIndex()-8

in.getByte(i+2)=='['

in.getByte(i+3)=='C'

in.getByte(i+4)=='D'

in.getByte(i+5)=='A'

in.getByte(i+6)=='T'

in.getByte(i+7)=='A'

in.getByte(i+8)=='[';

通過使用這些方法判斷好xml數(shù)據(jù)的起始位置之后,就可以調(diào)用extractFrame方法將要使用的ByteBuf從原始數(shù)據(jù)中拷貝出來,最后放到out中去:

finalByteBufframe=

extractFrame(in,readerIndex+leadingWhiteSpaceCount,xmlElementLength-leadingWhiteSpaceCount);

in.skipBytes(xmlElementLength);

out.add(frame);

XmlDecoder

將xml數(shù)據(jù)拆分成為一個(gè)個(gè)frame之后,接下來就是對xml中具體數(shù)據(jù)的解析了。

netty提供了一個(gè)xml數(shù)據(jù)解析的方法叫做XmlDecoder,主要用來對已經(jīng)是一個(gè)單獨(dú)的xml數(shù)據(jù)的frame進(jìn)行實(shí)質(zhì)內(nèi)容的解析,它的定義如下:

publicclassXmlDecoderextendsByteToMessageDecoder

XmlDecoder根據(jù)讀取到的xml內(nèi)容,將xml的部分拆分為XmlElementStart,XmlAttribute,XmlNamespace,XmlElementEnd,XmlProcessingInstruction,XmlCharacters,XmlComment,XmlSpace,XmlDocumentStart,XmlEntityReference,XmlDTD和XmlCdata。

這些數(shù)據(jù)基本上覆蓋了xml中所有可能出現(xiàn)的元素。

所有的這些元素都是定義在ty.handler.codec.xml包中的。

但是XmlDecoder對xml的讀取解析則是借用了第三方xml工具包:fasterxml。

XmlDecoder使用了fasterxml中的AsyncXMLStreamReader和AsyncByteArrayFeeder用來進(jìn)行xml數(shù)據(jù)的解析。

這兩個(gè)屬性的定義如下:

privatestaticfinalAsyncXMLInputFactoryXML_INPUT_FACTORY=newInputFactoryImpl();

privatefinalAsyncXMLStreamReaderAsyncByteArrayFeederstreamReader;

privatefinalAsyncByteArrayFeederstreamFeeder;

this.streamReader=XML_INPUT_FACTORY.createAsyncForByteArray();

this.streamFeeder=(AsyncByteArrayFeeder)this.streamReader.getInputFeeder();

decode的邏輯是通過判斷

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論