如何正确引用本地的 XML Schema 文件?

63

我在引用XML文件中的XML Schema时遇到了问题。

我的XSD文件在以下路径:

C:\environment\workspace\maven-ws\ProjectXmlSchema\email.xsd

但是当我在我的XML文件中尝试像这样定位模式时,XSD文件找不到:

<?xml version="1.0" encoding="UTF-8" ?>
    <email xmlns="http://www.w3schools.com"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.w3schools.com
                 file://C://environment//workspace//maven-ws//ProjextXmlSchema//email.xsd">

只有当XSD文件与当前文件在同一个文件夹下时,才能找到它:

           xsi:schemaLocation="http://www.w3schools.com email.xsd"

问题是这样的:如果XML文件不在与XSD文件相同的文件夹中,路径需要是什么样子才能找到XSD?

顺便说一下,我使用的示例来自MSDN:他们声称应该按照我尝试的方式工作。但它没能正常工作。


如果你希望本地引用模式,你可以轻松启动 Chrome 网页服务器插件并将其指向你的模式目录,然后使用模式的 http 地址更新你的 XML。 - Raf
@Raf,被接受的答案已经在5年前提出了使用Web浏览器验证本地XSD路径的想法。 - kjhughes
答案没有提到通过本地“Web服务器”访问您的“xsd”文件。是的,它确实提到了使用“Web浏览器”来验证本地路径的想法。在我的情况下,我不仅需要验证,还需要指示“eclipse”不要查找Spring repos,而是转到我的本地Web服务器(如果我记得正确,文件选项对我无效)。 - Raf
3个回答

64
xsi:schemaLocation的值后面再添加一个斜杠。 (您已经有两个,需要三个,请考虑protocol:// host / path,其中protocol'file'host在这里为空,产生连续的三个斜杠。) 您还可以消除path上的双斜杠。 我相信双斜杠有助于允许文件和目录名称中包含空格的文件系统,但您明智地避免了路径命名的复杂性。
xsi:schemaLocation="http://www.w3schools.com file:///C:/environment/workspace/maven-ws/ProjextXmlSchema/email.xsd"

还是不起作用?我建议你仔细地复制XSD的完整文件规范到Chrome或Firefox的地址栏中:

file:///C:/environment/workspace/maven-ws/ProjextXmlSchema/email.xsd

如果XSD在浏览器中没有显示,请删除路径中除了最后一个部分(email.xsd)以外的所有内容,看看是否可以显示父目录。继续这样做,向上遍历目录结构,直到发现路径与本地文件系统的实际情况不符为止。

如果XSD在浏览器中显示出来了,请说明你正在使用的XML处理器,并准备好听到它已经损坏或者你必须解决一些限制。我可以告诉你,上述修复方法适用于我的基于Xerces-J的验证器。


听起来不错,但实际效果并不好... :/ 还有更多的想法吗? - Arturas M
1
尝试通过浏览器检查完整的XSD文件规范。上面的答案已经更新了详细信息。 - kjhughes
5
非常感谢。这是一个绝妙的想法,尝试在浏览器中打开并查看/获取正确的路径。再次感谢,完美! - Arturas M
只有在提供完整路径时才能正常工作,如果我们只提供 file:///xsd/drools-spring.xsd 呢? - Vrajendra Singh Mandloi
2
只要目录之间的相对关系被正确捕获,像 xsd/drools-spring.xsd 这样的相对路径就可以了。如果你遇到问题,请发布一个新问题并提供你问题的 [mcve]。谢谢。 - kjhughes

5
也许可以检查一下 xsd 文件的路径是否包含像“é”这样的“奇怪”字符,类似的字符。我曾经遇到相同的问题,但当我更改了不包含“é”的路径时,错误消失了。

1
你的评论帮助我将文件名中的空格更改为(URL编码的)%20。也许使用URL编码可以解决你的问题?或者定义一个XML编码,如UTF-8,例如 <?xml version="1.0" encoding="utf-8"?> - Yahoo Serious

2
我觉得你可以使用这个:
xsi:noNamespaceSchemaLocation="relativePATH/file.xsd"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接