我有一个 XSD 架构,但我需要它位于两个可能的位置 - 一个用于开发(即我的 PC,一个用于生产。
有没有一种简单的机制可以做到这一点。例如开发 XML 将是:
<?xml version="1.0" encoding="utf-8"?>
<Request xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dev.example.com/ Request.xsd\">
<GetLocations />
</Request>
和生产
<?xml version="1.0" encoding="utf-8"?>
<Request xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/ Request.xsd\">
<GetLocations />
</Request>
这是为了启用 XSD <xs:include schemaLocation="DataTypes.xsd" />
中的行选择正确的文件。
附录
让我们做一个例子
假设我使用 PHP file_get_contents
检索 XML 文件。想要根据 XSD 文件检查它(通过 HTTP)。在该文件中它有 <xs:include schemaLocation="DataTypes.xdf" />
. PHP 脚本如何知道从何处获取此文件?
还有更多
我正在做以下事情
$xml = file_get_contents(<URL FOR XML FILE>);
$xsd = file_get_contents(<URL FOR XSD FILE>);
// The XSD has the include bit in it
$request = new DOMDocument();
$request->loadXML($xml, LIBXML_NOBLANKS);
file_put_contents(<some temporary filename>, $xsd);
if (!$request->schemaValidate(<some temporary filename>))
{
etc...
问题是如何确保 XSD 文件选择正确的 include
文件。我有两份架构副本。一个用于生产,另一个我正在添加额外的东西。
最佳答案
解释 schemaLocation
的行为:它 (XML) 与位于同一文件夹中的 XSD 文件配对(除非您指定了完整的文件路径/URL)。现在您知道从哪里加载 XSD 文件了。
现在在您的示例中,如果您通过 XML 解析器加载 XML,schemaLocation 就会出现,其中每对中的第一个 URI 引用是命名空间名称,第二个是描述该命名空间的模式的位置。
如果您将 XML 作为 Doc 加载并针对提供完整路径的 XSD 文件进行验证,schemaLocation
将被覆盖。
关于XML 多模式位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14303037/