我们的客户提供了大量的XML文件。该XML构成了我们软件的输入。但是我们只对这种大规模XML感兴趣。
不过,为了保护我们的软件免受我们感兴趣的部分的细微变化,我们希望验证客户XML所依赖的那些部分。
示例:
<node>
<offset>
<timezone>
<type>
<subtype>
<name>
<text>
<calibration-time>
<pattern>
... loads more elements
</node>
在以上元素中,我们的代码仅对元素<type>
,<subtype>
,<name>
和<text>
及其任何子元素感兴趣。其余的可以忽略。
这是我的XSD涉及此节点的相关部分:
<xsd:element name="node">
<xsd:complexType>
<xsd:all>
<xsd:element ref="type"/>
<xsd:element ref="subtype"/>
<xsd:element ref="name"/>
<xsd:element ref="text"/>
<!--
other child elements that we do not validate
-->
<xsd:element name="calibration-time" minOccurs="0"/>
<xsd:element name="offset" minOccurs="0"/>
<xsd:element name="timezone" minOccurs="0"/>
<xsd:element name="pattern" minOccurs="0"/>
... all the other elements we do not care about
</xsd:all>
</xsd:complexType>
</xsd:element>
问题:
我尝试了这种构造,但这是不合法的:
<xsd:element name="node">
<xsd:complexType>
<xsd:sequence>
<xsd:any processContents="skip" maxOccurs="unbounded"/>
<xsd:element name="type" type="le2-int"/>
<xsd:any processContents="skip" maxOccurs="unbounded"/>
<xsd:element name="subtype" type="le2-int"/>
<xsd:any processContents="skip" maxOccurs="unbounded"/>
<xsd:element name="name" type="le2-string"/>
<xsd:any processContents="skip" maxOccurs="unbounded"/>
<xsd:element name="text" type="le2-string"/>
<xsd:any processContents="skip" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
此外,如果事件仍然强制执行元素<type>
,<subtype>
,<name>
和<text>
的排序(一个不能出现在另一个的前面)
我肯定不能成为第一个面对这个问题的人吗? 我发现许多密切相关的SO文章几乎涵盖了相同的问题,但没有完全相同的文章,有的文章以其他方式可以轻松解决。
总而言之,有什么方法可以实现:
XSD在这里真的是正确的技术吗?