这是一个可能的模式 - 应该被视为一个起点。
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Information">
<xs:complexType>
<xs:sequence>
<xs:element name="description" type="xs:string" />
<xs:element minOccurs="0" name="officeName" type="xs:string" />
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:unsignedByte" />
<xs:element name="dept" type="xs:string" />
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="B">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:unsignedByte" />
<xs:element name="dept" type="xs:string" />
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="C">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:unsignedByte" />
<xs:element name="dept" type="xs:string" />
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required" />
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="D">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:unsignedByte" />
<xs:element name="dept" type="xs:string" />
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="ID" type="xs:unsignedByte" use="optional" />
</xs:complexType>
</xs:element>
</xs:schema>
就我而言,我使用QTAssistant(我与它相关联)通过将 XSD 指向您发布的两个 XML 文档来自动创建 XSD。
这就是我所拥有的(它验证了两者):
接下来的步骤应该是“合理化”生成的 XSD。例如,如果您查看元素 A、B、C 和 D 的内容模型,它们都共享相同;如果确实是这种情况,那么你可以有一个全局类型声明,基本上可以重用。或者,可能是 C 和 D 必须以“两者兼有”的组合出现,在这种情况下,额外的调整可能会实现这一点。下面是一个基于上述评论的手动修改的模式,让您了解它的外观。请记住,两个XSD 都会验证您的 XML。
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Information">
<xs:complexType>
<xs:sequence>
<xs:element name="description" type="xs:string"/>
<xs:element minOccurs="0" name="officeName" type="xs:string"/>
<xs:element name="A" type="atype"/>
<xs:element name="B" type="atype"/>
<xs:sequence minOccurs="0">
<xs:element name="C" type="atype"/>
<xs:element name="D" type="atype"/>
</xs:sequence>
</xs:sequence>
<xs:attribute name="ID" type="xs:unsignedByte" use="optional"/>
</xs:complexType>
</xs:element>
<xs:complexType name="atype">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:unsignedByte"/>
<xs:element name="dept" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id" type="xs:int" use="required"/>
</xs:complexType>
</xs:schema>
至此,可以看出后者在“源”方面更加紧凑。虽然内容模型非常相似。