XML验证遇'xsi'前缀未声明错误,请求排查原因
解决XML验证时“Namespace for prefix 'xsi' has not been declared”错误
这个错误提示看起来有点误导人——明明你的XML里已经声明了xsi前缀,问题其实出在**xsi:schemaLocation的格式不符合规范**上,我来一步步拆解:
问题背景
你在用意大利税务局的增值税数据传输Schema验证XML时遇到了报错,相关代码片段如下:
待验证的XML头部
<?xml version="1.0" encoding="utf-8" standalone="no"?> <p:RichiestaCertificatoDispositivo xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versione="1.0" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0/CorrispettiviMessaggiTypes_v1.0.xsd"> </p:RichiestaCertificatoDispositivo>
用于验证的Schema头部
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0" targetNamespace="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0" version="1.0"> <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="./xmldsig-core-schema.xsd" />
错误原因
xsi:schemaLocation的语法规则是**「目标命名空间 + 空格 + Schema文件路径/URL」**的成对组合(多命名空间场景可添加多对)。你现在的写法把命名空间和Schema文件名直接拼接成了一个字符串,导致验证工具无法正确区分两者,进而抛出了不准确的错误提示。
修复方案
修改XML中的xsi:schemaLocation属性,将命名空间和Schema路径用空格分隔开:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <p:RichiestaCertificatoDispositivo xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versione="1.0" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0 CorrispettiviMessaggiTypes_v1.0.xsd"> </p:RichiestaCertificatoDispositivo>
如果Schema文件不在当前工作目录,需要填写完整的本地路径或远程URL,比如:
xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0 http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0/CorrispettiviMessaggiTypes_v1.0.xsd"
修改后重新验证,这个错误就能解决了。
内容的提问来源于stack exchange,提问作者Giovanni
相关产品推荐
相关产品推荐

