XML 1.1中CDATA解析失败原因:Java SAX解析器报错探究
XML 1.1中CDATA段以']'结尾导致Java SAX解析报错的问题
问题现象
当XML版本指定为1.1,且CDATA段内容以单个']'结尾时,Java SAX解析器会抛出文档结构错误,但相同内容在XML 1.0中可正常解析。
示例XML(XML 1.1)
<?xml version="1.1" encoding="UTF-8"?> <book> <description><![CDATA[Release year [1997]]]></description> </book>
报错信息
XML document structures must start and end within the same entity.
XML 1.0下的正常情况
相同内容在XML 1.0中可被解析器正常处理:
<?xml version="1.0" encoding="UTF-8"?> <book> <description><![CDATA[Release year [1997]]]></description> </book>
原因分析
根据XML规范,无论1.0还是1.1版本,CDATA段的唯一结束标记都是]]>,仅该序列被禁止出现在CDATA内容中。但OpenJDK 17.0.7自带的SAX解析器(基于Xerces)在XML 1.1模式下的解析逻辑存在差异:
- 解析器在XML 1.1模式下扫描CDATA内容时,遇到']'会额外检查后续字符;若CDATA内容以单个']'结尾,解析器会误将其视为不完整的结束标记前缀,进而判定文档结构不合法。
- 而在XML 1.0模式下,解析器对CDATA的扫描逻辑更为宽松,仅当完整的
]]>序列出现时才判定为CDATA结束,因此单个结尾的']'不会触发错误。
内容的提问来源于stack exchange,提问作者RajV
相关产品推荐
相关产品推荐

