从以年为基础的XSD / XML开始,我想编写一个更简单的XSD,仅针对不会被修改或删除的元素,这可以从完整的XSD验证XML。
简单来说:
有了这个XML:
<root>
<unknown1/>
<known2/>
<unknown2/>
<known1/>
<unknown3/>
<unknown4/>
</root>
而这个XSD:
<xsd:schema>
<xsd:element name="root">
<xsd:all>
<xsd:element name="unknown1" minOccurs="0"/>
<xsd:element name="unknown2" minOccurs="0"/>
<xsd:element name="unknown3" minOccurs="0"/>
<xsd:element name="unknown4" minOccurs="0"/>
<xsd:element name="known1" minOccurs="0"/>
<xsd:element name="known2" minOccurs="0"/>
</xsd:all>
</xsd:element name="root">
</xsd:schema>
我想做一些像:
<xsd:schema>
<xsd:all>
<xsd:any processControl="skip" />
<xsd:element name="known1" />
<xsd:element name="known2" />
</xsd:schema>
此XSD无效,因为xsd:any
只能出现在xsd:sequence
或xsd:choice
中
我想知道如何使用类似的简单XSD验证原始XML文件
你可以制作一个已知的1,2和xs:choice
的xs:any
,并将maxOccurs
设置为unbounded
。
编辑:这仍然只处理可选案例,但我意识到你不必在xs:choice
中嵌套xs:sequence
。
这是一个允许的工作模式
<known1>
和<known2>
元素之间的自由秩序<known1>
或<known2>
(或两者)请注意,您必须将<xs:any>
允许的元素限制为除<known1>
或<known2>
之外的其他命名空间。否则架构将变得明确,因为<xs:any>
也允许<known1>
或<known2>
。需要注意的另一件事是,在这里我们需要有时在minOccurs
或<xs:choice>
上设置<xs:sequence>
属性,以保持模式的确定性。
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
<xs:choice minOccurs="0">
<xs:sequence>
<xs:element name="known1" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
<xs:sequence minOccurs="0">
<xs:element name="known2" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
</xs:sequence>
</xs:sequence>
<xs:sequence>
<xs:element name="known2" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
<xs:sequence minOccurs="0">
<xs:element name="known1" />
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
</xs:sequence>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
简短的回答:使用XSD 1.1
然后您的提案将有效。更加具体:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:element name="root" type="root"/>
<xs:complexType name="root">
<xs:all>
<!-- Required -->
<xs:element name="known1" type="xs:string"/>
<!-- Optional -->
<xs:element name="known2" type="xs:string" minOccurs="0"/>
<xs:element name="known3" type="xs:string" minOccurs="0"/>
<!-- Unknown -->
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
</xs:all>
</xs:complexType>
</xs:schema>