我的编程空间,编程开发者的网络收藏夹
学习永远不晚

netty中常用的xml编码解码器怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

netty中常用的xml编码解码器怎么用

这篇文章主要讲解了“netty中常用的xml编码解码器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“netty中常用的xml编码解码器怎么用”吧!

简介

在json之前,xml是最常用的数据传输格式,虽然xml的冗余数据有点多,但是xml的结构简单清晰,至今仍然运用在程序中的不同地方,对于netty来说自然也提供了对于xml数据的支持。

netty对xml的支持表现在两个方面,第一个方面是将编码过后的多个xml数据进行frame拆分,每个frame包含一个完整的xml。另一方面是将分割好的frame进行xml的语义解析。

进行frame拆分可以使用XmlFrameDecoder,进行xml文件内容的解析则可以使用XmlDecoder,接下来我们会详细讲解两个decoder实现和使用。

XmlFrameDecoder

因为我们收到的是数据流,所以不确定收到的数据到底是什么样的,一个正常的xml数据可能会被拆分成多个数据frame。

如下所示:

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

这是一个正常的xml数据,但是被拆分成为了三个frame,所以我们需要将其合并成为一个frame如下:

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

还有可能不同的xml数据被分拆在多个frame中的情况,如下所示:

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

上面的数据需要拆分成为两个frame:

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

拆分的逻辑很简单,主要是通过判断xml的分隔符的位置来判断xml是否开始或者结束。xml中的分隔符有三个,分别是&rsquo;<', &lsquo;>&rsquo; 和 &lsquo;/&rsquo;。

在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数据:

 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数据的起始位置之后,就可以调用extractFrame方法将要使用的ByteBuf从原始数据中拷贝出来,最后放到out中去:

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

XmlDecoder

将xml数据拆分成为一个个frame之后,接下来就是对xml中具体数据的解析了。

netty提供了一个xml数据解析的方法叫做XmlDecoder,主要用来对已经是一个单独的xml数据的frame进行实质内容的解析,它的定义如下:

public class XmlDecoder extends ByteToMessageDecoder

XmlDecoder根据读取到的xml内容,将xml的部分拆分为XmlElementStart,XmlAttribute,XmlNamespace,XmlElementEnd,XmlProcessingInstruction,XmlCharacters,XmlComment,XmlSpace,XmlDocumentStart,XmlEntityReference,XmlDTD和XmlCdata。

这些数据基本上覆盖了xml中所有可能出现的元素。

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

但是XmlDecoder对xml的读取解析则是借用了第三方xml工具包:fasterxml。

XmlDecoder使用了fasterxml中的AsyncXMLStreamReader和AsyncByteArrayFeeder用来进行xml数据的解析。

这两个属性的定义如下:

 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的类型来分别进行不同数据的读取,最后将读取到的数据封装成上面我们提到的各种xml对象,最后将xml对象添加到out list中返回。

感谢各位的阅读,以上就是“netty中常用的xml编码解码器怎么用”的内容了,经过本文的学习后,相信大家对netty中常用的xml编码解码器怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

netty中常用的xml编码解码器怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

netty中常用的xml编码解码器怎么用

这篇文章主要讲解了“netty中常用的xml编码解码器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“netty中常用的xml编码解码器怎么用”吧!简介在json之前,xml是最常用的数
2023-06-30

netty中的frame解码器怎么用

这篇文章主要介绍“netty中的frame解码器怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“netty中的frame解码器怎么用”文章能帮助大家解决问题。简介netty中的数据是通过Byte
2023-06-30

Golang中XML数据的编码和解码方法及应用

Golang中XML序列化和反序列化的方法及应用在Golang中,XML是一种常用的数据格式,用于在不同系统之间传递和存储数据。在处理XML数据时,我们通常需要进行序列化和反序列化的操作,将数据转换成XML格式或从XML格式中读取数据。
Golang中XML数据的编码和解码方法及应用
2024-01-29

Pytho中有哪些常用的编码

Pytho中有哪些常用的编码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、ASCIIASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,
2023-06-19

Android 怎么用Lame编码器编码mp3文件

这篇文章主要介绍“Android 怎么用Lame编码器编码mp3文件”,在日常操作中,相信很多人在Android 怎么用Lame编码器编码mp3文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android
2023-06-14

JS代码编译器中Monaco怎么用

这篇文章给大家分享的是有关JS代码编译器中Monaco怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言我的需求是可以语法高亮、函数提示功能、自动换行、代码折叠MonacoMonaco是微软家的,支持的语言
2023-06-15

怎么理解Python中的编码

这篇文章主要介绍“怎么理解Python中的编码”,在日常操作中,相信很多人在怎么理解Python中的编码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Python中的编码”的疑惑有所帮助!接下来,请跟
2023-06-02

怎么理解PHP中JSON的编码与转码

这篇文章主要介绍“怎么理解PHP中JSON的编码与转码”,在日常操作中,相信很多人在怎么理解PHP中JSON的编码与转码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解PHP中JSON的编码与转码”的疑
2023-06-25

Android 代码中的XML怎么利用控件进行代替

本篇文章给大家分享的是有关Android 代码中的XML怎么利用控件进行代替,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现代码:Button btn = new Butto
2023-05-31

java中怎么用argument设置编码

在Java中,可以使用-D参数设置编码。命令行启动Java程序时,可以使用-Dfile.encoding参数指定编码。例如,要将编码设置为UTF-8,可以在命令行中使用以下命令启动Java程序:java -Dfile.encoding=UT
2023-10-18

Linux代码编辑器medit怎么用

这篇文章主要为大家展示了“Linux代码编辑器medit怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux代码编辑器medit怎么用”这篇文章吧。medit 是一个面向程序员编程的文
2023-06-27

java中的unicode编码方式怎么使用

在Java中,可以使用\u后面跟着四个十六进制数字的方式表示Unicode编码的字符。例如,要表示字符'中'的Unicode编码为U+4E2D,可以使用\u4E2D来表示。以下是一个示例代码,演示了如何使用Unicode编码方式表示字符:`
2023-09-25

Android使用Pull解析器解析xml文件的实现代码

2个类:1个实体类Person.java,1个继承Activity的类 1.Person.java代码如下:package com.mrzhu.work_1_sax; public class Person { private Stri
2022-06-06

java中怎么使用filewriter指定编码

在Java中,可以使用FileWriter来指定编码。下面是一个示例代码:```javaimport java.io.FileWriter;import java.io.IOException;import java.io.Unsuppor
2023-09-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录