验证cXML时DTD指定行解析报错是DTD问题还是.Net解析器问题?
问题根源判定
该报错是DTD本身语法不严谨导致的,不属于.NET解析器的问题,具体原因如下:
- 你贴出的参数实体定义内容以管道符
|开头,当这个实体被嵌入到元素内容模型的对应位置时,很容易出现连续管道符的非法语法,违反XML 1.0的DTD嵌套规则。 - 不同XML解析器的语法严格度不同,部分低严格度的解析器会自动兼容这种冗余的开头管道符,但.NET的XML解析器默认遵循严格语法规范,因此会抛出对应报错。
替换为空字符串的影响
将该行替换为空字符串属于临时规避方案,带来的影响如下:
- 该参数实体的作用是给cXML的
Object元素扩展允许的子节点类型,原本定义的xades:QualifyingProperties、cXMLSignedInfo、Extrinsic三类子元素会被从合法列表中移除。 - 如果你需要验证的cXML文件中,
Object节点永远不会用到上述三类子元素,那么该修改不会影响正常验证结果;如果你的业务场景需要用到XML签名、自定义扩展字段,后续遇到包含上述三类子元素的cXML文件时,DTD验证会直接抛出子元素不合法的报错。 - 更稳妥的修复方案是移除实体内容开头的冗余管道符,修改为
<!ENTITY % Object.ANY 'xades:QualifyingProperties|cXMLSignedInfo|Extrinsic'>,既可以解决嵌套报错问题,也不会丢失原有的扩展规则。
内容的提问来源于stack exchange,提问作者adrianm
相关产品推荐
相关产品推荐

