一直在想,就像我们使用-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"
..只是为了给我们一个唯一的XML命名空间,或者它是否也提供了关于模式可以位于何处的信息?
答案 0 :(得分:18)
尝试 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处理器都不会忽略这个“提示”。
网址始终是唯一的,但在某些情况下,会在网址下提供一些信息。
答案 1 :(得分:4)
xsi:noNamespaceSchemaLocation和xsi:schemaLocation都向决定遵守这些提示的XML处理器提供提示。但它们只是提示。它们不一定会导致您的文档根据架构进行验证。
答案 2 :(得分:3)
我通常只包含命名空间,并期望如果正在处理它关心验证它,那么他们将获得架构并设置其处理环境,以便它可以找到XSD。我xsi:schemaLocation
和这些属性的成功有限。大多数问题通常集中在寻找XSD文件本身。有些处理器希望包含路径,如果XSD位于文件系统而不是Web服务器上,那么这些路径会很有趣。
每个处理器似乎都以不同的方式实现了查找。有些使用单独的模式目录对象,有些则需要您单独加载和附加模式。除非您提供处理文档的代码,否则最好不要包含xsi:schemaLocation
或xsi:noNamespaceSchemaLocation
恕我直言。他们所包含的唯一能做的就是腿筋,他们正在处理您的文档,无论是将模式放在同一位置,还是找到一些方法来使他们选择的处理器忽略或解决位置规范。
作为旁注,我遇到的最大问题实际上是使用引用SYSTEM
的{{1}}声明指定的DTD。问题是我在FreeBSD盒子上处理文件。我最终编写了自己的解析器来将Windows样式的路径映射到本地文件系统,因为我无法自行修改文档,并且需要对它们进行验证。
答案 3 :(得分:3)
这不是一个愚蠢的问题,而是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