一直在想,就像我们使用-declaration将XML绑定到DTD一样,我们如何使用XSD做到这一点?
MSDN示例:
<?xml version="1.0"?>
<Product ProductID="123"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Product.xsd">
<ProductName>Rugby jersey</ProductName>
</Product>
是xsi:NoNamespaceSchemaLocation可以解决这个问题吗?或者这只是另一个命名空间?
[编辑]并且是
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
..line只是为了给我们一个唯一的XML命名空间,还是它还提供了关于架构所在位置的信息?
尝试schemaLocation。
<?xml version="1.0"?>
<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
noNamespaceSchemaLocation是不同的。请注意,对于XML文档的使用者来说,两者在理论上确实只是“提示”。我从来没有遇到过不遵循它们的xml处理器;毕竟,这是W3C的推荐。见http://www.w3.org/TR/xmlschema-1/
但事实上,它可能会出错,就像here一样,但话又说回来,它被认为是一个错误。
简而言之:我只相信它,到目前为止没有任何伤害:-)
我认为任何半体面的xml处理器都不会忽视这些“提示”。
网址始终是唯一的,但在某些情况下,网址下会提供一些信息。
xsi:noNamespaceSchemaLocation和xsi:schemaLocation都向决定遵守这些提示的XML处理器提供提示。但它们只是提示。它们不一定会导致您的文档针对架构进行验证。
我通常只包含命名空间,并期望如果正在处理它关心验证它,那么他们将获得模式并设置其处理环境,以便它可以找到XSD。我在xsi:schemaLocation
和这些属性方面取得了有限的成功。大多数问题通常集中在寻找XSD文件本身。如果XSD位于文件系统而不是Web服务器上,某些处理器希望包含路径,这是有趣的。
每个处理器似乎都以不同的方式实现查找。有些使用单独的模式目录对象,有些则需要您单独加载和附加模式。除非您提供处理文档的代码,否则最好不要包括xsi:schemaLocation
或xsi:noNamespaceSchemaLocation
恕我直言。他们所包含的唯一能做的就是腿筋,他们正在处理您的文档,要么将模式放在同一个位置,要么找到一些方法让他们选择的处理器忽略或解决位置规范。
作为旁注,我遇到的最大问题实际上是使用引用SYSTEM
的"c:\somepath\doc.dtd"
声明指定的DTD。问题是我在FreeBSD盒子上处理文件。我最终编写了自己的解析器来将Windows样式的路径映射到本地文件系统,因为我无法自己修改文档并且需要对它们进行验证。
这不是一个愚蠢的问题,但John Saunders has it right。
就像我们使用-decleration将XML绑定到DTD一样,我们如何使用XSD进行操作?
这是问题的本质 - 你不能。 DTD方法的一个问题是文档指定了验证机制而不是文档使用者。在DTD之后,您可以获取XML文档并使用XSD或RELAX NG或其他一些机制对其进行验证 - 它们是分离的(至少在理论上)。任何XSD链接只是一个提示,是可选的。 It is not possible to validate an arbitrary document。