XSD 歧义,同一复杂类型中的多个合成器
XSD ambiguities, multiple compositors in the same complex type
XSD 复杂类型,好吧……复杂
先了解一些事实:
- 元素可以有 minOccurs、maxOccurs 并且可以是子元素
- 合成器 (choice/all/sequence) 可以有自己的 minOccurs/maxOccurs
- 同一复杂类型中可以连续使用多个合成器
- 此外,合成器可以嵌套(例如,在 2 个序列之间进行选择)
正因为如此,我认为这在 xsd/xml (pseudo-xsd):
中是可能的
<someComplexType>
<sequence minOccurs=0>
<element A>
<element B>
</sequence>
<sequence>
<element A>
<element C>
</sequence>
</someComplexType>
不确定是否合法,但有可能。
现在,假设 sax/stax 解析器看到元素 A。
接下来会发生什么?
我应该如何确定它是第一个序列中的 A 还是第二个序列中的 A...在检查 next 元素之前?
如果下一个元素是 B,这个 A 可能(!)是第一个序列的匹配项。
如果下一个元素是 C,则同一个 A 可能(!)与第二个序列匹配。
("Probably" 因为上面的整个事情可以是另一个序列的可选嵌套部分,这让我认为这是一个递归问题,它可能发生在任何深度并且做出决定可能必须检查后面的多个元素,在多个深度)
使用类似的 xsd,在解析 xml 时,(我认为)不可能判断当前元素是否属于特定的合成器,直到......稍后,甚至不确定什么时候。
无论如何,这是我的两个问题:
- 这样的xsd合法吗?确定性的?遵循唯一粒子属性 (UPA) 规则?或者上帝知道还有什么其他术语?
- 如果这是合法的 xsd, sax/stax 解析器如何判断当前元素何时匹配某物,任何东西?不是解析器本身,他不在乎,而是必须解释当前元素的调用者。我想它必须知道下一个元素才能做出正确的决定(选择最佳匹配),这对于 sax/stax 来说是不可能的,仅基于当前的元素。
ps: 试图创建一个 xml 映射工具(不要问为什么)我不知道如何将解析的内容与 xsd 结构匹配,在这种情况下。
非常感谢
任何 XSD 处理者都会告诉您,您的内容模型不被允许,因为它不明确,原因与您描述的完全相同。 (它违反了 UPA 约束)。内容可以(而且必须)从 (AB | AC)
更改为 A (B|C)
.
当然,也有类似的技术(例如正则表达式处理器或 RelaxNG)允许使用歧义语法:解析它们需要先行或回溯等技术。
如果您打算实现执行此任务的处理器,我建议您阅读一些计算机科学知识。 Aho 和 Ullmann 的 "Dragon book" 是一本标准的教科书 - 非常古老,但仍然非常有用(不记得书名了,我把我的副本留在了办公室)。更具体地说,关于 XSD,可以在爱丁堡大学的 Henry Thompson 网站上找到 Thompson 和 Tobin 的几篇好论文。
XSD 复杂类型,好吧……复杂
先了解一些事实:
- 元素可以有 minOccurs、maxOccurs 并且可以是子元素
- 合成器 (choice/all/sequence) 可以有自己的 minOccurs/maxOccurs
- 同一复杂类型中可以连续使用多个合成器
- 此外,合成器可以嵌套(例如,在 2 个序列之间进行选择)
正因为如此,我认为这在 xsd/xml (pseudo-xsd):
中是可能的<someComplexType>
<sequence minOccurs=0>
<element A>
<element B>
</sequence>
<sequence>
<element A>
<element C>
</sequence>
</someComplexType>
不确定是否合法,但有可能。
现在,假设 sax/stax 解析器看到元素 A。
接下来会发生什么? 我应该如何确定它是第一个序列中的 A 还是第二个序列中的 A...在检查 next 元素之前?
如果下一个元素是 B,这个 A 可能(!)是第一个序列的匹配项。
如果下一个元素是 C,则同一个 A 可能(!)与第二个序列匹配。
("Probably" 因为上面的整个事情可以是另一个序列的可选嵌套部分,这让我认为这是一个递归问题,它可能发生在任何深度并且做出决定可能必须检查后面的多个元素,在多个深度)
使用类似的 xsd,在解析 xml 时,(我认为)不可能判断当前元素是否属于特定的合成器,直到......稍后,甚至不确定什么时候。
无论如何,这是我的两个问题:
- 这样的xsd合法吗?确定性的?遵循唯一粒子属性 (UPA) 规则?或者上帝知道还有什么其他术语?
- 如果这是合法的 xsd, sax/stax 解析器如何判断当前元素何时匹配某物,任何东西?不是解析器本身,他不在乎,而是必须解释当前元素的调用者。我想它必须知道下一个元素才能做出正确的决定(选择最佳匹配),这对于 sax/stax 来说是不可能的,仅基于当前的元素。
ps: 试图创建一个 xml 映射工具(不要问为什么)我不知道如何将解析的内容与 xsd 结构匹配,在这种情况下。
非常感谢
任何 XSD 处理者都会告诉您,您的内容模型不被允许,因为它不明确,原因与您描述的完全相同。 (它违反了 UPA 约束)。内容可以(而且必须)从 (AB | AC)
更改为 A (B|C)
.
当然,也有类似的技术(例如正则表达式处理器或 RelaxNG)允许使用歧义语法:解析它们需要先行或回溯等技术。
如果您打算实现执行此任务的处理器,我建议您阅读一些计算机科学知识。 Aho 和 Ullmann 的 "Dragon book" 是一本标准的教科书 - 非常古老,但仍然非常有用(不记得书名了,我把我的副本留在了办公室)。更具体地说,关于 XSD,可以在爱丁堡大学的 Henry Thompson 网站上找到 Thompson 和 Tobin 的几篇好论文。