XML多模式位置
我有一个XSD模式,但我需要它在两个可能的位置-一个用于开发(即我的PC和一个用于生产) 是否有一个简单的机制来实现这一点。例如,XML的开发将是:XML多模式位置,xml,xsd,schema,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:schemaL
<?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>
问题是如何确保XSD文件拾取正确的
include
文件。我有两个模式副本。一个用于生产,另一个用于添加额外内容。除非您分析XSD文件以查找schemaLocation
属性,否则PHP脚本将不知道include在哪里,这可能是错误的或者可能不在那里,因为它是完全可选的
将架构导入另一个架构时,不需要提供架构的路径。大多数XSD验证器将在相同的/子文件夹中查找命名空间与import语句匹配的任何XSD文件。有些甚至会完全忽略schemaLocation属性。解释
schemaLocation
的行为:(XML)与驻留在同一文件夹中的XSD文件配对(除非您指定了完整的文件路径/URL)
现在,在您的示例中,如果您通过XML解析器加载XML,则会出现schemaLocation,其中每对中的第一个URI引用是名称空间名称,第二个是描述该名称空间的模式的位置
如果将XML加载为Doc并根据提供完整路径的XSD文件进行验证,
schemaLocation
将被覆盖。如果架构保持不变,则可以将其托管在公共位置,提供其绝对URI而不是相对URI,每个人都可以在那里找到它
如果模式发生了变化(您说您正在向模式的开发版本添加“额外的东西”?什么样的东西?)您正在查看XML架构版本控制问题。除了能够找到架构之外,还有更多问题,请参阅以获取一些建议。导入元素执行与包含元素相同的操作。但是,导入元素允许您访问来自相同/多个架构的组件,这些架构可能属于不同的目标命名空间。 以下是语法:
<import id="ID" namespace="namespace" schemalocation="filename"/>
<include id="ID" schemaLocation="anyURI" any attributes/>
include元素用于包含或引用位于特定地址的外部模式。
以下是语法:
<import id="ID" namespace="namespace" schemalocation="filename"/>
<include id="ID" schemaLocation="anyURI" any attributes/>
include元素允许引用在相同目标命名空间的上下文中定义的任何外部架构。架构的目标命名空间是使用schema元素的targetNamespace属性声明的。include元素中不需要namespace属性,因为包含和不同的模式是相同的
据我所知,@infantpro'aravind'已经解释了SchemaAction行为。这: XSD也是如此:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.example.com/xml" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="branch" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
也就是说,它正在寻找schemaLocation
中指定的Request.xsd
。相对路径(c:\windows\system32\inetsrv\
)是服务运行的起点
希望这有帮助。
xsi:schemaLocation
只是一个提示-大多数工具允许您在架构之外指定架构。但这取决于工具-因此如果说出您正在使用的工具,它会有所帮助。@13ren-将使用各种工具。只需要XSD/XML自包含,这样无论使用什么工具。我认为您感到困惑。xsi:schemaLocation中空格前的URL是命名空间URI,不一定是实际位置。如果您使用的是实际的XML文件,并且XSD位于同一文件夹中,则相对路径可能会起作用。@JLRishe-如何确保我没有使用
的任何经验,但有一种可能的选择n是在执行验证之前(在代码中),修改文档元素的xsi:schemaLocation
属性或将其添加到文档元素中。对
的处理有可能是特定于实现的,但这可能值得一试。您将获得奖品-其中最有用的答案(尽管我正在做这件事)。将为未来的人更新帖子的结果。我脑子里有一个灯泡:)所以发布。很高兴你发现它很有用,happy SOing:)请在测试完成后发布你的分析!我在.net平台上测试了此行为。不同的平台可能会有所不同。。渴望知道:)不!我只是尝试使用asp.net根据流输入XSD验证流输入XML。我有一个不同的行为,我在答案中更新了我的发现。
<Request xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/ Request.xsd\">
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/ Request.xsd\">
<branch>data</branch>
</root>
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.example.com/xml" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="branch" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Cannot load the schema for the namespace 'http://www.example.com/' - Could not find file 'c:\windows\system32\inetsrv\Request.xsd\'.. Line: 1 Column:40