从逐年发展的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文件
答案 0 :(得分:0)
您可以制作已知的1,2和xs:choice
的{{1}},并将xs:any
设置为maxOccurs
。
修改:这仍然只处理可选案例,但我意识到您不必在unbounded
中嵌套xs:choice
。
答案 1 :(得分:0)
这是一个允许
的工作架构<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>
答案 2 :(得分:0)
简短的答案:使用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>