XML 多模式位置

标签 xml xsd schema

我有一个 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/

相关文章:

C# - XML - 压缩

javascript - Visual Studio 2015 - Html 编辑器 - 自定义架构?

mysql - 在 MySQL 中存储年龄的好模式,无需引用出生日期

javascript - Mongoose 和 express : POST data from subdocument

java - JAXB 是否支持默认模式值?

java - XSLT 将计数器与字段名称连接起来以使其动态化

c# - 如何验证签名的 XML 文件签名

java - 如何将 Java 的 XPath 库与 XML 命名空间结合使用?

java - Cowardly 拒绝写入不存在的目录 - JAXB

java - 如何为列表 JAXB 制作 setter