是不是在xsd中有相同名称的元素?

时间:2015-02-18 14:34:14

标签: xsd schema xsd-validation

我的XML看起来像。我有两个同名的元素。但是我无法在XSD中获得这些元素。

Here Book是两次出现但具有不同属性的元素。其各自的Book元素中的所有属性都是必需的。

错误说

  

元素图书与元素图书

不一致

XML:

<TestRoot>
<Test Shelf="1">
  <Value>
     <Book Name="Wolves" />
  </Value>
</Test>
<Test Shelf="2">
  <Value>
     <Book Name="Dogs" Pages="500" Photos="50" />
  </Value>
 </Test>
</TestRoot>

我的XSD看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema....>
<xsd:element name="TestRoot">
    <xsd:complexType>
        <xsd:sequence minOccurs="1" maxOccurs="1">
            <xsd:element name="Test" minOccurs="1" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:choice>
                        <xsd:element name="Value">
                            <xsd:complexType>
                                <xsd:choice minOccurs="1" maxOccurs="1">
                                    <xsd:element name="Book">
                                        <xsd:complexType>
                                            <xsd:attribute name="Name" use="required">
                                                <xsd:simpleType>
                                                    <xsd:restriction base="xsd:string">
                                                        <xsd:maxLength value="40"/>
                                                        <xsd:enumeration value="Wolves"/>
                                                    </xsd:restriction>
                                                </xsd:simpleType>
                                            </xsd:attribute>
                                        </xsd:complexType>
                                    </xsd:element>
                                    <xsd:element name="Book">
                                        <xsd:complexType>
                                            <xsd:attribute name="Book" use="required">
                                                <xsd:simpleType>
                                                    <xsd:restriction base="xsd:string">
                                                        <xsd:maxLength value="40"/>
                                                        <xsd:enumeration value="Dogs"/>
                                                    </xsd:restriction>
                                                </xsd:simpleType>
                                            </xsd:attribute>
                                            <xsd:attribute name="Pages" use="required">
                                                <xsd:simpleType>
                                                    <xsd:restriction base="xsd:string">
                                                        <xsd:maxLength value="50"/>
                                                    </xsd:restriction>
                                                </xsd:simpleType>
                                            </xsd:attribute>
                                            <xsd:attribute name="Photos" use="required">
                                                <xsd:simpleType>
                                                    <xsd:restriction base="xsd:string">
                                                        <xsd:maxLength value="24"/>
                                                    </xsd:restriction>
                                                </xsd:simpleType>
                                            </xsd:attribute>
                                        </xsd:complexType>
                                    </xsd:element>
                                </xsd:choice>
                            </xsd:complexType>
                        </xsd:element>
                    </xsd:choice>
                    <xsd:attribute name="Shelf" use="optional">
                        <xsd:simpleType>
                            <xsd:restriction base="xsd:string">
                                <xsd:maxLength value="100"/>
                                <xsd:enumeration value="1"/>
                                <xsd:enumeration value="2"/>
                            </xsd:restriction>
                        </xsd:simpleType>
                    </xsd:attribute>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
</xsd:schema>

不确定我错在哪里?有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="TestRoot" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="TestRoot" msdata:IsDataSet="true" msdata:Locale="en-US">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Test">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Value" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <!-- the <Book> node is just of "BookType" type -->
                    <xs:element name="Book" type="BookType" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="Shelf" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element> 
  <!-- define the "BookType" which represents a single <Book> node -->
  <xs:complexType name="BookType">
      <xs:attribute name="Name" type="xs:string" use="required" />
      <xs:attribute name="Pages" type="xs:string" />
      <xs:attribute name="Photos" type="xs:string" />
  </xs:complexType>
</xs:schema>

此XSD定义了一个新的复杂类型BookType,用于定义<Book>内的<Value>节点的外观。

一般情况下,我还会为您拥有的任何XML节点定义复杂类型 - 我创建一个ValueType来处理<Value>节点的方式我已为TestType创建了<Test>,为TestRootType创建了<TestRoot>

拥有那些真正深度嵌套的XSD结构使得很难“掌握”正在发生的事情 - 为每个节点定义一个类型然后将它们分配给节点使得它更具可读性和可理解性,在我看来