2009-10-11 61 views
2

曾几何时,我有一个有效的文档类型和有效的XML。我把前者放在后者的上面,控制器注视着:一切都应该如此。现在我有一个有效的模式(为我仍然有效的XML构建的定制)。我尝试了同样的尝试和真实的方法 - 但唉,没有成功。有效的XML,有效的模式。我哪里错了?

我得到不同的错误,我使用的每个不同的验证程序,但我提交它的浏览器新错误(但这是有道理的)。所以我不确定我应该给予哪些帮助最大。 Validome说:

无法找到元素'xs:schema'的声明。

根元素下面的文档中的标记必须被良好地形成。

(但它是!)

如果它会是有XML和模式是有用的,请不要犹豫,问,我只是想,既然它们都是W3有效,冗长,我会试着先把它们留下。我所做的只是将架构放在XML之上并通过验证器/浏览器发送。

谢谢!

+0

您是否尝试将您的XML减少为单个元素并根据您的模式对其进行测试? – 2009-10-11 17:02:44

+0

是的。那么,根据模式的要求,实际上有两个元素,还有几个孩子。 – 2009-10-11 17:31:17

回答

3

@Nona模式是一个格式良好的文档,您的实例也是如此。但是,如果您将它们连接起来,结果将不再完整。

如果你拥有的是:

<xs:schema ...>...</xs:schema> 
<myxml ...>...</myxml> 

,这是没有很好地形成(没有单一的根元素)

之所以DTD做法不同的是,内部子集是专门允许被预先添加到根元素。所以:

<DOCTYPE myxml [ 
... my DTD ... 
]> 
<myxml ...>...</myxml> 

形成良好。

不幸的是,将模式与实例关联并不是完全微不足道的。您可能需要查看xsi:schema-location

UPDATE 不幸的是,答案取决于您使用的软件框架。 AFAIK无法打包文档和模式,以至于任何软件都会接受并尝试进行验证。这就是为什么模式比DTD更努力的原因。

这里是一个简单的网站,您可以提交两个文件并进行测试。

除此之外的任何东西都可能需要软件知识。根据你是否使用ORACLE,微软等,会有不同的方法。这可以通过调用方法来加载文档,加载模式然后验证,或者设置属性(可以在Xerces中完成)来完成。

答案可能取决于你为什么这样做。如果您要将文档提交给架构所有者,那么他们将会有一个验证系统。如果您必须针对别人的模式进行阻止,那么您需要获取模式验证软件并运行该模式。你在MS或Unix/Java?

更多更新 推荐What's the best way to validate an XML file against an XSD file? 正如他们所说,没有超简单的方法。

+0

为什么当我尝试内联它时,为什么还要乱搞模式位置?我虽然搜索了它,并且一次无法推断下一步。也许你可以帮助我与另一个指针? – 2009-10-11 17:26:56

+0

内联并不是一个好主意。原则上,模式是可重用的,可以验证许多文档。在每个文档中重复它与该原则相冲突,并且如果架构需要更改,可能会导致问题。 – 2015-07-15 04:05:35

0

只是在黑暗中刺,但你有根元素上声明的XML架构命名空间前缀?这是xmlns:xs =“http://www.w3.org/2001/XMLSchema”。如果名称空间前缀未绑定到名称空间名称,则该文档无效。

+0

是的,我确实声明了该名称空间。虽然 – 2009-10-11 17:27:43

0

在陈述明显的风险时,您可能需要考虑验证器无法找到元素xs:schema声明的原因。

第二个错误提示有一个角支架缺少某处,或者有一些元素没有正确嵌套。

+0

但正如我所说,它形成良好。我相信这个错误是误导性的,并且源于另一个问题。至于“显而易见”,我完全没有理由认为它被封装在有效的模式中时找不到。 – 2009-10-11 17:30:40