如何将XML链接到XSD?

问题描述 投票:20回答:4

一直在想,就像我们使用-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命名空间,还是它还提供了关于架构所在位置的信息?

xml xsd
4个回答
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处理器都不会忽视这些“提示”。

网址始终是唯一的,但在某些情况下,网址下会提供一些信息。


4
投票

xsi:noNamespaceSchemaLocation和xsi:schemaLocation都向决定遵守这些提示的XML处理器提供提示。但它们只是提示。它们不一定会导致您的文档针对架构进行验证。


3
投票

我通常只包含命名空间,并期望如果正在处理它关心验证它,那么他们将获得模式并设置其处理环境,以便它可以找到XSD。我在xsi:schemaLocation和这些属性方面取得了有限的成功。大多数问题通常集中在寻找XSD文件本身。如果XSD位于文件系统而不是Web服务器上,某些处理器希望包含路径,这是有趣的。

每个处理器似乎都以不同的方式实现查找。有些使用单独的模式目录对象,有些则需要您单独加载和附加模式。除非您提供处理文档的代码,否则最好不要包括xsi:schemaLocationxsi:noNamespaceSchemaLocation恕我直言。他们所包含的唯一能做的就是腿筋,他们正在处理您的文档,要么将模式放在同一个位置,要么找到一些方法让他们选择的处理器忽略或解决位置规范。

作为旁注,我遇到的最大问题实际上是使用引用SYSTEM"c:\somepath\doc.dtd"声明指定的DTD。问题是我在FreeBSD盒子上处理文件。我最终编写了自己的解析器来将Windows样式的路径映射到本地文件系统,因为我无法自己修改文档并且需要对它们进行验证。


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

© www.soinside.com 2019 - 2024. All rights reserved.