libexpat不能处理XML中非正常字符的问题
2017-09-15 20:54
239 查看
LIBEXPAT:
libexpat: https://libexpat.github.io, 是一个处理XML非常快速的开源库,用c语言写,应用很广泛。
问题:
dmanywhere中,就使用了这个组件来解析powerdesigner生成的pdm和ldm, 在线测试阶段,发现一些朋友上传的pdm和ldm无法正常解析,不能当做正常xml处理。
经过分析,发现,正常情况下,xml里面是由正常字符和 回车,tab等组成。但有不正常的情况,有些文件里面存在 不可见的字符,如ascii码为19的,为31的这些 字符。
这时候,默认情况下,libexpat当做非法文件处理,导致服务解析。
解决:
暂时采用一个简单的浅度解决方案,方法如下:
修改文件:
libexpat/lib/asciitab.h
libexpat/lib/iasciitab.h
打开文件后,就会发现,这里面定义各个ascii字符的处理方式,默认情况下为:
/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML,
/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML,
/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
这里面,这些字符都当坐BT_NONXML,
修改他们为:
/* 0x00 */ BT_NONXML, BT_S, BT_S, BT_S,
/* 0x04 */ BT_S, BT_S, BT_S, BT_S,
/* 0x08 */ BT_S, BT_S, BT_LF, BT_S,
/* 0x0C */ BT_S, BT_S, BT_S, BT_S,
/* 0x10 */ BT_S, BT_S, BT_S, BT_S,
/* 0x14 */ BT_S, BT_S, BT_S, BT_S,
/* 0x18 */ BT_S, BT_S, BT_S, BT_S,
/* 0x1C */ BT_S, BT_S, BT_S, BT_S,
除了0之外,都当做空格处理。
另外一种做法是,新增一种BYTE_TYPE,如BYTE_NULL, 对这种字符进行忽略。
重新编译后,下次遇到非法字符就能当做空格处理了。
libexpat: https://libexpat.github.io, 是一个处理XML非常快速的开源库,用c语言写,应用很广泛。
问题:
dmanywhere中,就使用了这个组件来解析powerdesigner生成的pdm和ldm, 在线测试阶段,发现一些朋友上传的pdm和ldm无法正常解析,不能当做正常xml处理。
经过分析,发现,正常情况下,xml里面是由正常字符和 回车,tab等组成。但有不正常的情况,有些文件里面存在 不可见的字符,如ascii码为19的,为31的这些 字符。
这时候,默认情况下,libexpat当做非法文件处理,导致服务解析。
解决:
暂时采用一个简单的浅度解决方案,方法如下:
修改文件:
libexpat/lib/asciitab.h
libexpat/lib/iasciitab.h
打开文件后,就会发现,这里面定义各个ascii字符的处理方式,默认情况下为:
/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML,
/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML,
/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
这里面,这些字符都当坐BT_NONXML,
修改他们为:
/* 0x00 */ BT_NONXML, BT_S, BT_S, BT_S,
/* 0x04 */ BT_S, BT_S, BT_S, BT_S,
/* 0x08 */ BT_S, BT_S, BT_LF, BT_S,
/* 0x0C */ BT_S, BT_S, BT_S, BT_S,
/* 0x10 */ BT_S, BT_S, BT_S, BT_S,
/* 0x14 */ BT_S, BT_S, BT_S, BT_S,
/* 0x18 */ BT_S, BT_S, BT_S, BT_S,
/* 0x1C */ BT_S, BT_S, BT_S, BT_S,
除了0之外,都当做空格处理。
另外一种做法是,新增一种BYTE_TYPE,如BYTE_NULL, 对这种字符进行忽略。
重新编译后,下次遇到非法字符就能当做空格处理了。
相关文章推荐
- androidのstring.xml转译、特殊字符问题处理
- 处理生成xml,遇到超出范围字符导致报错的问题
- 解决Rss/Xml中一不能被识别的特殊字符问题
- 处理内容有&特殊字符thinkphp返回xml无法解析的问题<![CDATA[xxx]]>
- mysql数据库不能处理中文字符问题
- URL传参中不能带特殊的字符以及处理方案
- selenium初始化火狐浏览器时不能应用相关插件的问题处理
- Css处理文字与图片不能水平居中对齐的问题
- XMLHttpRequest请求的缓存问题的处理方案
- XML中值不能含有保留字、&,如果含有的话可以做如下处理
- 如何处理Oledb中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- scanf能赋值字符数组,不能赋值给指针的问题
- 处理SDK编译成功后客户端不能使用的问题
- 处理资源文件(Resources.properties)的字符问题 & 使用
- 不能发布订阅大字段的问题处理
- 项目中使用Spring时配置web.xml的listener侦听接口不能初始化的问题
- 在将DataSet转成XML时遇到一个非法字符的问题
- XML 特殊字符的处理
- XML中遇到特殊字符无法解析的问题
- 关于字符底层处理的问题