最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解netty中常用的xml編碼解碼器

 更新時間:2022年05月13日 16:22:50   作者:flydean程序那些事  
這篇文章主要介紹了netty中常用的xml編碼解碼器,進行frame拆分可以使用XmlFrameDecoder,進行xml文件內(nèi)容的解析則可以使用XmlDecoder,接下來我們會詳細(xì)講解兩個decoder實現(xiàn)和使用,感興趣的朋友一起看看吧

簡介

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

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

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

XmlFrameDecoder

因為我們收到的是數(shù)據(jù)流,所以不確定收到的數(shù)據(jù)到底是什么樣的,一個正常的xml數(shù)據(jù)可能會被拆分成多個數(shù)據(jù)frame。

如下所示:

+-------+-----+--------------+
   | <this | IsA | XMLElement/> |
   +-------+-----+--------------+

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

 +-----------------+
   | <thisIsAXMLElement/> |
   +-----------------+

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

+-----+-----+-----------+-----+----------------------------------+
   | <an | Xml | Element/> | <ro | ot><child>content</child></root> |
   +-----+-----+-----------+-----+----------------------------------+

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

+-----------------+-------------------------------------+
   | <anXmlElement/> | <root><child>content</child></root> |
   +-----------------+-------------------------------------+

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

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

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

 private static boolean isValidStartCharForXmlElement(final byte b) {
        return b >= 'a' && b <= 'z' || b >= 'A' && b <= 'Z' || b == ':' || b == '_';
    }

是否是注釋:

  private static boolean isCommentBlockStart(final ByteBuf in, final int i) {
        return i < in.writerIndex() - 3
                && in.getByte(i + 2) == '-'
                && in.getByte(i + 3) == '-';
    }

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

 private static boolean isCDATABlockStart(final ByteBuf in, final int i) {
        return i < in.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中去:

final ByteBuf frame =
                    extractFrame(in, readerIndex + leadingWhiteSpaceCount, xmlElementLength - leadingWhiteSpaceCount);
            in.skipBytes(xmlElementLength);
            out.add(frame);

XmlDecoder

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

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

public class XmlDecoder extends ByteToMessageDecoder 

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

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

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

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

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

這兩個屬性的定義如下:

 private static final AsyncXMLInputFactory XML_INPUT_FACTORY = new InputFactoryImpl();
    private final AsyncXMLStreamReader<AsyncByteArrayFeeder> streamReader;
    private final AsyncByteArrayFeeder streamFeeder;
            this.streamReader = XML_INPUT_FACTORY.createAsyncForByteArray();
        this.streamFeeder = (AsyncByteArrayFeeder)this.streamReader.getInputFeeder();

decode的邏輯是通過判斷xml element的類型來分別進行不同數(shù)據(jù)的讀取,最后將讀取到的數(shù)據(jù)封裝成上面我們提到的各種xml對象,最后將xml對象添加到out list中返回。

總結(jié)

我們可以借助XmlFrameDecoder和XmlDecoder來實現(xiàn)非常方便的xml數(shù)據(jù)解析,netty已經(jīng)為我們造好輪子了,我們就不需要再自行發(fā)明了。

到此這篇關(guān)于netty中常用的xml編碼解碼器的文章就介紹到這了,更多相關(guān)netty解碼器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用hutool工具進行導(dǎo)入導(dǎo)出excel表格

    使用hutool工具進行導(dǎo)入導(dǎo)出excel表格

    如何在后臺添加導(dǎo)入導(dǎo)出表格的功能呢,本期的文章將會帶領(lǐng)小伙伴們一起實現(xiàn)此功能,文中有詳細(xì)的代碼示例和圖文介紹,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • Java創(chuàng)建類模式_動力節(jié)點Java學(xué)院整理

    Java創(chuàng)建類模式_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Java創(chuàng)建類模式的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • MyBatis實現(xiàn)SQL映射文件

    MyBatis實現(xiàn)SQL映射文件

    映射器是 MyBatis 中最復(fù)雜并且是最重要的組件,本文主要介紹了MyBatis實現(xiàn)SQL映射文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • java 中匿名內(nèi)部類的實例詳解

    java 中匿名內(nèi)部類的實例詳解

    這篇文章主要介紹了java 中匿名內(nèi)部類的實例詳解的相關(guān)資料,這里提供實例來幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • 淺談java web中常用對象對應(yīng)的實例化接口

    淺談java web中常用對象對應(yīng)的實例化接口

    下面小編就為大家?guī)硪黄獪\談java web中常用對象對應(yīng)的實例化接口。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • java中hashmap容量的初始化實現(xiàn)

    java中hashmap容量的初始化實現(xiàn)

    這篇文章主要介紹了java中hashmap容量的初始化實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • java多線程讀取多個文件的方法

    java多線程讀取多個文件的方法

    這篇文章主要為大家詳細(xì)介紹了java多線程讀取多個文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java面向?qū)ο缶幊讨惖睦^承詳解

    Java面向?qū)ο缶幊讨惖睦^承詳解

    這篇文章主要介紹了Java面向?qū)ο缶幊讨惖睦^承,結(jié)合實例形式較為詳細(xì)的分析了Java面向?qū)ο缶幊填惖母拍?、功能、使用方法及相關(guān)注意事項,需要的朋友可以參考下
    2018-02-02
  • 一文帶你了解如何正確使用MyBatisPlus

    一文帶你了解如何正確使用MyBatisPlus

    在本篇文章中,我們獎通過?MyBatis?Plus?來對一張表進行?CRUD?操作,來看看是如何簡化我們開發(fā)的。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • springboot集成redis實現(xiàn)簡單秒殺系統(tǒng)

    springboot集成redis實現(xiàn)簡單秒殺系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了springboot集成redis實現(xiàn)簡單秒殺系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論

平遥县| 射洪县| 潼南县| 黔东| 满洲里市| 柘城县| 内黄县| 屯留县| 贵溪市| 繁昌县| 尤溪县| 永修县| 弥勒县| 龙井市| 延吉市| 竹山县| 天津市| 武平县| 金川县| 正蓝旗| 泉州市| 苍梧县| 张北县| 德阳市| 西乡县| 伊春市| 长春市| 敦化市| 麻城市| 苍南县| 涡阳县| 托克托县| 灵石县| 安平县| 阳春市| 泸水县| 江安县| 九龙城区| 汉沽区| 白玉县| 满洲里市|