XML和扩展类型

时间:2015-07-09 09:37:47

标签: xml validation xsd

我希望能够使用XSD验证XML中的字段,其中一个字段必须是

类型
  <ABC>ABC1</ABC>

最高为ABC999,或

  <ABC>none<ABC>

为此,我已经制作了一个XSD来验证这个字段如下:

<xs:simpleType name="Format1">
    <xs:restriction base="xs:string">
        <xs:pattern value="ABC([0-9]{1,4})"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="Format2">
    <xs:restriction base="xs:string">
        <xs:enumeration value="none"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="Allowed">
    <xs:union memberTypes="Format1 Format2"/>
</xs:simpleType>

元素如下:

<xs:element name="ABC" type="Allowed"/>

但是,我的测试使用我知道有问题的标签传递,例如:

<ABC>1</ABC>

将通过测试。

我是否需要在XSD中按特定顺序定义简单类型,或者我在做其他错误的操作?正则表达式似乎很好。

此致

这给了我错误,说复杂类型需要一个名称属性..如果我添加一个名称属性,测试通过,即使他们不应该

validate.py:

def test_schema_structure(self):
    f = open('docvalidator.xsd')
    doc = ET.parse(f)
    xml_schema = ET.XMLSchema(doc)

    featuresubset = ET.parse('featuresubset.xsd')
    xml_schema.validate(featuresubset)

要验证的xml:

 <!-- other elements --->
   <xs:documentation>
    <Countries>
      <Country type="EU">Spain</Group>
      <Country type="EU">Greece</Group>
      <country type="EU">Germany</Group>
    </Countries>
    <ABC>asdasd</ABC>
    <Description>Some text</Description>
    <Consumers/>
  </xs:documentation>

1 个答案:

答案 0 :(得分:1)

我认为结合ABC。*和none的方面会简化问题:

<xs:simpleType name="Allowed">
  <xs:restriction base="xs:string">
      <xs:pattern value="ABC([0-9]{1,4})|none"/>
  </xs:restriction>
</xs:simpleType>

在同一位置使用具有相同元素名称的两种不同类型必然会产生问题 - 不确定某些解析器如何处理该联合。