想要创建XML模式来验证两个XMLS

时间:2013-03-25 09:15:39

标签: wpf xml xsd

我有2个Xml文件。我们可以将第一个文件称为master,因为它具有所有节点,而在第二个文件中只有少量信息存在。 我如何创建支持这两个文件的单个xsd。

File1:

     <Information ID="08" >
<description>office information</description>
<officeName>SBV</officeName>
<A id="234"> 
    <name>xyz</name>
    < age>23</age> 
    <dept>SE</dept>
</A> 
<B id="244"> 
    <name>lkj</name>
    < age>27</age> 
    <dept>Sales</dept>
</B>
<C id="264"> 
    <name>opi</name>
    < age>34</age> 
    <dept>Manufacture</dept>
</C> 
<D id="774"> 
    <name>yui</name>
    < age>25</age> 
    <dept>Production</dept>
</D>
</Information>

File2:
    <Information >
<description>Worker information</description>
<A id="234"> 
    <name>xyz</name>
    < age>23</age> 
    <dept>WP</dept>
</A> 
<B id="244"> 
    <name>lkj</name>
    < age>27</age> 
    <dept>WP</dept>
</B>
</Information>

1 个答案:

答案 0 :(得分:1)

这是一种可能的模式 - 应该被视为一个起点。

<?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(我与之关联)通过将其指向您发布的两个XML文档来自动创建XSD。

这就是我所拥有的(它验证了两者):

enter image description here

接下来的步骤应该是“合理化”生成的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>

到目前为止,人们可以看到后者在“来源”方面更为紧凑。内容模型非常相似。

enter image description here