我希望能够使用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>
答案 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>
在同一位置使用具有相同元素名称的两种不同类型必然会产生问题 - 不确定某些解析器如何处理该联合。