优先用本地xmllint验证,命令必须带--schema且xsd路径为绝对或相对当前目录;在线仅试freeformatter.com;xsi:schemalocation仅为提示,不触发自动验证;java中需用lsresourceresolver或source数组绕过uri解析。

在线XSD验证器打不开或报404
很多标榜“在线XSD验证”的网站实际已下线,或只支持极简XML(比如不带命名空间、无import或include),一上传就返回404或Internal Server Error。根本原因是后端用的libxml2或Xerces版本老旧,且没暴露错误详情。
实操建议:
- 优先用本地工具——浏览器里跑不动的,
xmllint几秒搞定 - 若必须在线,试
https://www.freeformatter.com/xml-validator-xsd.html(目前仍可用,支持基础xs:import) - 避开所有要求“注册”“登录”才能验证的站点,它们通常把校验逻辑前端化,根本不走XSD解析
xmllint --schema 命令总提示 no DTD found
这是最常踩的坑:xmllint默认只认DTD,加--schema才走XSD,但很多人漏写--schema,或把XSD路径拼错,结果误报成“找不到DTD”。真实错误其实是failed to load external entity,但提示语误导性很强。
实操建议:
- 命令必须带
--schema,且XSD路径要**绝对路径**或相对当前工作目录,不能是XML里的schemaLocation值 - 验证前先
ls -l your.xsd确认文件存在、权限可读 - 如果XSD引用了其他XSD(如
xs:import namespace="http://example.com/ns" schemaLocation="common.xsd"),需用--nonet并确保所有依赖XSD都在同一目录,否则xmllint直接放弃解析
示例:xmllint --schema ./order.xsd --noout order.xml
XML里写了xsi:schemaLocation但验证仍失败
xsi:schemaLocation只是提示,不是指令。验证器是否读它、怎么读,完全取决于实现。Java的SchemaFactory默认忽略它,xmllint压根不看它,只有.NET的XmlSchemaSet.Add这类API会主动加载。
实操建议:
- 别指望靠
xsi:schemaLocation自动触发验证——它只对某些IDE(如IntelliJ、Oxygen)的编辑时提示有用 - 命名空间URI和XSD文件路径必须严格匹配:如果XSD声明
targetNamespace="http://my.org/ns",那么schemaLocation中对应的部分就得是"http://my.org/ns xxx.xsd",顺序错一个空格都导致跳过 - 验证时显式传入XSD路径,比依赖
schemaLocation可靠十倍
Java里用SchemaFactory验证报错 Cannot resolve uri
Java默认的SchemaFactory(com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory)遇到xs:import中的schemaLocation会尝试HTTP拉取,而你的XSD在本地磁盘,自然报Cannot resolve uri 'file:///path/to/common.xsd'或连接超时。
实操建议:
- 用
LSResourceResolver拦截URI解析,把file://或相对路径转成FileInputStream - 或者更简单:用
schemaFactory.newSchema(new Source[]{new StreamSource("main.xsd")}),手动把所有XSD作为Source数组传入,绕过URI解析 - 避免在XSD里写
http://开头的schemaLocation,除非真有公网可访问的XSD服务
真正卡住人的从来不是语法,而是XSD之间import/include的路径解析规则、命名空间绑定时机、以及不同工具对xsi:schemaLocation的各自理解——这些细节不亲手试三遍,文档根本看不出问题在哪。








