【发布时间】:2011-01-24 21:22:43
【问题描述】:
有没有办法防止在您的 xml 中使用 <myElement/> 形式的空元素?换句话说,你能在你的xsd中指定<myElement/>是无效的吗?
使用nillable="false" 不起作用,minOccurs="1" 也不起作用 - 两者都允许
<myElement/>.
【问题讨论】:
标签: xml validation xsd
有没有办法防止在您的 xml 中使用 <myElement/> 形式的空元素?换句话说,你能在你的xsd中指定<myElement/>是无效的吗?
使用nillable="false" 不起作用,minOccurs="1" 也不起作用 - 两者都允许
<myElement/>.
【问题讨论】:
标签: xml validation xsd
如果您想完全阻止该元素出现,您可以用maxOccurs="0" 标记它。我猜这不是您所追求的,因此,如果您要确保始终有属性附加到复杂元素,那么您必须在至少一个属性上指定 usage="required" 或使用一个属性组。如果myElement 是一个简单类型并且您想确保它有一个值,那么您总是可以限制它的类型。如果你想要一个非零字符串,那么你可以这样做:
<xsd:element name="myElement">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
【讨论】:
xsd:date 是一个简单的类型。但如果不是简单类型,可以使用<xsd:complexType>。虽然,对于这些,我通常使用xsd:element 的type 属性,即:<xsd:element name="myElement" type="someComplexType" />
minLength 是非字符串简单类型的有效属性?
xsd:date ,那么空元素是不可接受的,因为它适用于几乎所有类型。
如果您的架构验证无法显示错误,当数据类型 DATE 的元素为空时,您可以使用模式 [如果键入所需格式不是您的负担];
我添加了一个示例,类似代码的实现将适用于您的工具,
这是示例 XML:
<root>
<date1>12/31/1999</date1> <!-- The Date format defined here is MM/DD/YYYY, null value or Date with any other format aren't accepted-->
</root>
这是对应的 XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="Date_Def.xsd"/>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="date1" type="DATE_TYPE" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
请注意,我包含了另外一个包含 DATE_TYPE 类型定义的架构文件,
这是 Date_Def.xsd 文件:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DATE_TYPE">
<xs:restriction base="xs:string">
<xs:pattern value="([0][1-9]|[1][0-2])/([0][1-9]|[1-2][0-9]|[3][0-1])/[1-2][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
此处定义的日期格式为 MM/DD/YYYY,不接受空值或任何其他格式的日期, 如果你还想接受一个空标签,用这个替换模式 ..
<xs:pattern value="|(([0][1-9]|[1][0-2])/([0][1-9]|[1-2][0-9]|[3][0-1])/[1-2][0-9][0-9][0-9])"/>
接受空标签或模式 MM/DD/YYYY 的日期值的验证。
如果您在模式设计方面需要更多帮助,请随时在 SO 中发帖,希望对您有所帮助。 :-)
[note::Type-Definition 也可以 在同一个文件中定义,这需要 中提到的其他命名空间 XML 以及 XSD 文件,定义一个 外部文件是无害的 可重复使用]
【讨论】: