XML与XSD分属不同包时,如何用相对路径实现XSD验证?
如何将XML的Schema Location改为相对路径并保留Eclipse验证功能
我来帮你搞定这个问题——把绝对路径的Schema引用改成相对路径,同时保留Eclipse的验证功能其实很简单,分几种场景来操作:
场景1:fonts.xsd和fonts.xml在同一个目录下
这是最常见的情况,直接修改fonts.xml里的xsi:schemaLocation属性,把绝对路径换成文件名即可:
修改后的fonts.xml代码:
<!-- name="default" version="110" --> <fonts xmlns="http://www.example.org/fonts" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/fonts fonts.xsd"> <font fontName="defaultRegular" fontSize="17" fontFamily="Roboto-Regular"/> <font fontName="defaultLight" fontSize="17" fontFamily="Roboto-Light"/> <font fontName="defaultMedium" fontSize="17" fontFamily="Roboto-Medium"/> <font fontName="defaultBold" fontSize="17" fontFamily="Roboto-Bold"/> <font fontName="intermediateLight" fontSize="16" fontFamily="Roboto-Light"/> <font fontName="intermediateRegular" fontSize="16" fontFamily="Roboto-Regular"/> <font fontName="intermediateMedium" fontSize="16" fontFamily="Roboto-Medium"/> <font fontName="intermediateBold" fontSize="16" fontFamily="Roboto-Bold"/> <font fontName="smallLight" fontSize="14" fontFamily="Roboto-Light"/> <font fontName="smallRegular" fontSize="14" fontFamily="Roboto-Regular"/> <font fontName="smallMedium" fontSize="14" fontFamily="Roboto-Medium"/> <font fontName="smallBold" fontSize="14" fontFamily="Roboto-Bold"/> <font fontName="smallerLight" fontSize="12" fontFamily="Roboto-Light"/> <font fontName="tinyLight" fontSize="10" fontFamily="Roboto-Light"/> <font fontName="bigRegular" fontSize="21" fontFamily="Roboto-Regular"/> </fonts>
改完之后右键项目选Refresh,Eclipse会自动从相对路径加载XSD,原来的验证规则(比如删除必填属性报错)完全保留。
场景2:fonts.xsd在不同的包/目录下
如果XSD和XML不在同一个目录,需要根据目录层级写相对路径。比如假设你的项目结构是这样的:
你的项目根目录/ ├─ src/main/resources/ │ ├─ com/java/mypackage/fonts/ │ │ └─ fonts.xml │ └─ com/java/shared/schemas/ │ └─ fonts.xsd
那从fonts.xml的位置到fonts.xsd的相对路径是../../../../shared/schemas/fonts.xsd,修改后的schemaLocation就是:
xsi:schemaLocation="http://www.example.org/fonts ../../../../shared/schemas/fonts.xsd"
不过这种跨目录的相对路径容易因为项目结构变动失效,更推荐用Eclipse XML Catalog的方法,一劳永逸:
用XML Catalog配置全局Schema引用
- 打开Eclipse的偏好设置:
Window -> Preferences -> XML -> XML Catalog - 点击右侧的Add按钮
- 在弹出窗口中,选择File System,浏览找到你的
fonts.xsd文件 - 「Key type」选择
Namespace name,「Key」填入你的XSD目标命名空间:http://www.example.org/fonts - 点击OK保存配置
之后不管你的XSD文件移动到哪里,只要更新Catalog里的路径,Eclipse都会通过命名空间自动找到它,甚至可以直接去掉schemaLocation属性,验证功能依然正常。
验证功能是否保留
修改完成后,你可以测试一下:随便删除一个<font>元素的fontName属性,Eclipse应该立刻弹出验证错误,说明原来的验证逻辑完全生效。
内容的提问来源于stack exchange,提问作者Claudiu
相关产品推荐
相关产品推荐

