![]() |
1
53
你的问题已经解决了,但不会很漂亮。这就是为什么: 违反非确定性内容模型您已经触及了W3C XML模式的精髓。 和 变量未知元素-违反了XSD最困难但最基本的原则,即 非歧义 或者更正式地说, Unique Particle Attribution Constraint :
在普通英语中:当XML被验证并且XSD处理器遇到
这是最有争议的问题之一,是SGML和DTD(内容模型)的传统 必须是确定性的 )和XML,默认情况下,它定义元素的顺序 是重要的 (因此,尝试相反的方法,使顺序不重要,是很困难的)。 正如Marc_已经建议的那样,RELAX_ng是一个允许非确定性内容模型的替代方案。但是,如果您坚持使用W3CXML模式,您可以做什么呢? 非工作半有效解
你已经注意到了
另外,你可能尝试过各种组合
在 O'Reilly's XML Schema (是的,这本书有缺点)这解释得很好。此外,这本书的部分内容可在网上查阅。我强烈建议你通读 section 7.4.1.3 about the Unique Particle Attribution Rule 他们的解释和例子比我所能得到的要清楚得多。 一个有效的解决方案在大多数情况下,从不确定性设计到确定性设计是可能的。这通常看起来不漂亮,但如果必须坚持W3CXML模式和/或必须允许对XML使用非严格的规则,这是一个解决方案。你的情况下的噩梦是你想强制一件事(2个预先定义的元素),同时想让它非常松散(顺序不重要 和 任何事都有可能发生。如果我不想给你很好的建议,而是直接把你带到一个解决方案中,它会如下所示:
上面的代码实际上
只是作品
. 但有一些警告。第一个是
第二点需要注意的是,如果你想在两个或三个以上的地方使用这个技巧,你必须写下所有的组合。维护的噩梦。这就是我提出以下问题的原因: 建议的解决方案,变量内容容器的变体改变你的定义。这样做的好处是让你的读者或用户更清楚。它还具有易于维护的优点。一系列的解决方案 are explained on XFront here ,一个可读性较低的链接,您可能已经从Oleg的帖子中看到过。这是一个很好的阅读,但是大部分没有考虑到在变量内容容器中至少需要两个元素。
当前针对您的情况的最佳实践方法(比您可能想象的更频繁)是将数据拆分为必需和非必需字段。可以添加元素
目前这似乎不太理想,但让它增长一点。拥有一组有序的固定元素并不是什么大事。您不是唯一一个抱怨W3C XML模式明显缺陷的人,但是正如我前面所说,如果必须使用它,您将不得不忍受它的局限性,或者以更高的拥有成本接受围绕这些局限性开发的负担。 替代方案我敢肯定你已经知道了,但是属性的顺序在默认情况下是不确定的。如果您的所有内容都是简单的类型,那么您可以选择更充分地使用属性。 最后一句话
无论采用什么方法,都会失去很多数据的可验证性。通常最好允许内容提供者添加内容类型,但只有在可以验证时才允许。您可以通过从
|
![]() |
2
6
读完答案后 马尔库斯 你在评论中的讨论,我决定加一点。 在我看来 没有完美的解决方案 关于你的问题 乍得 . 在XSD中有一些实现可扩展内容模型的方法,但是所有已知的实现都有一些限制。因为您没有写计划使用可扩展XSD的环境,所以我只能推荐一些链接,这些链接可能会帮助您选择可以在环境中实现的方式:
|
![]() |
3
4
您应该能够用
当你添加
见 MSDN docs on xs:any 了解更多详细信息。 更新: 如果您需要更大的灵活性和不太严格的验证,那么您可能希望了解为XML定义模式的其他方法,比如 RelaxNG . XML模式是有目的的,对其规则相当严格,所以这可能是目前这项工作的错误工具。 |
![]() |
4
1
好吧,除了DTD还规定了订购之外,您可以一直使用DTD:-。使用“无序”语法进行验证非常昂贵。你可以玩xsd:choice,最小值和最大值也会出现,但它可能也会停止。您还可以编写XSD扩展/派生模式。 你提出问题的方式看起来你根本不想要XSD。你可以加载它,然后用xpaths验证你想要的最小值,但是仅仅是抗议xsd,它成为无所不在的标准后的多少年,真的,真的不会让你得到任何地方。 |
|
5
1
如果你能使用它,放松会简单地解决这个问题。确定性不是模式的要求。您可以将RNG或RNC模式转换为XSD,但在这种情况下它将是近似的。这是否适合你使用取决于你自己。 这种情况下的RNC模式是:
any规则匹配任何格式良好的XML片段。因此,这将要求用户元素以任何顺序包含givenname和姓氏元素,并允许任何其他元素包含几乎所有内容。 |
![]() |
JobProcessTask · 如何读取此xpath表达式? 2 年前 |
![]() |
MBF · PHP导入/解析XML文件内容保存到数据库 2 年前 |
![]() |
TenkMan · SQL Server XML嵌套值查询表单990 2 年前 |
![]() |
Mohan.Murali.Peddini · XSLT模板循环记录 2 年前 |