如何使用属性限制complexType中的元素内容?

时间:2016-06-16 15:58:23

标签: xml xsd xsd-validation xml-validation

我正在尝试借助XSD验证XML。

以下是我的XML示例:

<Cells 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation= "ImportCellsXSD.xsd">
    <Cell spread="2" row="128" column="51">p</Cell>  
    <Cell spread="0" row="10" column="1">ea</Cell>        
    <Cell spread="0" row="8" column="2">d</Cell>                  
</Cells>

这是我的XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema  elementFormDefault="qualified" attributeFormDefault="unqualified" 
             xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="Cells">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>   

    <xs:complexType name="TCell">
        <xs:sequence>
            <xs:element name="Cell" type="TCellValidation" maxOccurs="unbounded"/>

        </xs:sequence>
        <xs:attribute name="spread" type="TSpread" use="required"/>
        <xs:attribute name="row" type="TRow" use="required"/>
        <xs:attribute name="column" type="TColumn" use="required"/>
    </xs:complexType>    

    <xs:simpleType name="TCellValidation">
        <xs:restriction base="xs:string">       
            <xs:pattern value="[A-Za-z0-9]+"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

TSpreadTColumnTRow只是对minInclusivemaxInclusive

的验证

当我尝试验证xml时,我发现此错误尝试读取“p”,“ea”和“d”

  

cvc-complex-type.2.3:元素'Cell'不能有字符[children],   因为类型的内容类型是仅元素。 [6]   cvc-complex-type.2.4.b:元素'Cell'的内容不完整。   预计会有一个'{Cell}'。 [6]

如何定义cell的内容? (p,ea和d)

1 个答案:

答案 0 :(得分:1)

您的XSD要求Cell个元素位于Cell个元素内 - 可能不是您想要的,绝对不是您的XML所具有的。

这是您修复的XSD以消除上述问题并验证您的XML:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema  elementFormDefault="qualified" attributeFormDefault="unqualified" 
            xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="Cells">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>   

  <xs:complexType name="TCell">
    <xs:simpleContent>
      <xs:extension base="TCellValidation">
        <xs:attribute name="spread" type="xs:string" use="required"/>
        <xs:attribute name="row" type="xs:string" use="required"/>
        <xs:attribute name="column" type="xs:string" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>    

  <xs:simpleType name="TCellValidation">
    <xs:restriction base="xs:string">       
      <xs:pattern value="[A-Za-z0-9]+"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

TSpreadTColumnTRow未在您发布的XSD中定义,因此我将其标记为xs:string,但原则保持不变。)< / p>