使用cxml-rng验证XML与XSD Schema时遇未定义函数错误
问题描述
尝试使用cxml-rng验证一批XML文件与指定XSD格式Schema,已知cxml-rng支持XSD,但无法成功运行。
验证函数代码如下:
(defun validate (xml xsd) (let* ((schema (cxml-rng:parse-schema xsd)) (validator (cxml-rng:make-validator schema))) (cxml:parse-file xml validator))
运行时出现错误:
Error: Call to (SETF CXML-RNG::GRAMMAR-START) which was not defined at compile time with arguments (#S(CXML-RNG::DEFINITION :NAME :START :COMBINE-METHOD NIL :HEAD-P NIL :REDEFINITION NIL :CHILD #) #S(CXML-RNG::GRAMMAR :START NIL :PARENT NIL :DEFINITIONS #))
已通过xmllint完成相同验证,确认该Schema文件有效,求解决建议。
解决建议
- 升级cxml-rng版本:这个错误大概率是版本兼容性问题,旧版cxml-rng在处理XSD转RelaxNG的逻辑中存在未定义函数的bug,建议升级到最新稳定版。
- 显式指定Schema类型:
parse-schema默认可能按RelaxNG格式解析,尝试传入:type :xsd参数明确指定处理XSD文件:(cxml-rng:parse-schema xsd :type :xsd) - 排查XSD特殊构造:虽然xmllint验证通过,但部分XSD的复杂构造(如多层继承、自定义约束)可能在cxml-rng的XSD解析逻辑中存在处理盲区。可以先简化XSD(移除非核心的自定义类型或约束),测试是否能正常解析,逐步定位问题点。
- 提前转换为RNG文件:使用trang、xmllint等工具先将XSD转换为RelaxNG格式文件,再用cxml-rng验证XML与转换后的RNG,绕开cxml-rng内置的XSD解析环节:
转换命令示例(trang):
修改后的验证函数:trang your-schema.xsd your-schema.rng(defun validate (xml rng) (let* ((schema (cxml-rng:parse-schema rng)) (validator (cxml-rng:make-validator schema))) (cxml:parse-file xml validator))
内容的提问来源于stack exchange,提问作者mhevesen
相关产品推荐
相关产品推荐

