如何在XSD中定义必填属性以实现错误异常处理?
问题
需要在XSD中定义必填属性,以便错误处理环节抛出异常。目前已成功将LinePaymentAmount设为必填元素,缺失该字段时会正常抛出异常,但使用use="required"标记必填属性却无效,参考相关博客后仍未解决。
提供的XSD代码
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Req_Pay"> <xs:complexType> <xs:sequence> <xs:element name="Package" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Payment" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Line" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="LinePaymentAmount" minOccurs="1" nillable="false"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute name="Agg" type="xs:string" use="required" /> <xs:attribute name="ConNum" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="PayId" type="xs:string" use="required" /> <xs:attribute name="Cur" type="xs:string" use="required" /> <xs:attribute name="Memo" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="PackagePaymentAmount" type="xs:string" use="required" /> <xs:attribute name="PackagePaymentQuantity" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
XSD层级结构
Req_Pay (Element) - Package (Element) - PackagePaymentAmount (attribute 1) - PackagePaymentQuantity (attribute 2) **(Mandatory Field)** - Payment (Element) - PayId (attribute 1) - Cur (attribute 2) **(Mandatory Field)** - Memo (attribute 3) **(Mandatory Field)** - Line (Element) - LinePaymentAmount (Element) **(Mandatory Field)** - Agg (attribute 1) - ConNum (attribute 2) **(Mandatory Field)**
测试XML数据
<?xml version="1.0" encoding="UTF-8"?> <Req_Pay> <Package PackagePaymentAmount="452.88" PackagePaymentQuantity="200.00"> <Payment PayId="1000000-0001" Cur="USD" Memo="AK005-18308-20222"> <Line Agg="yes" ConNum="MED" > <LinePaymentAmount>226.4400</LinePaymentAmount> </Line> <Line Agg="yes" ConNum="FFS" > <LinePaymentAmount>226.4400</LinePaymentAmount> </Line> </Payment> </Package> </Req_Pay>
解决方案
你的XSD中使用use="required"定义必填属性的语法是完全正确的,无效问题大概率出在验证环节而非XSD本身,可按以下步骤排查修复:
使用标准XML Schema验证工具
部分轻量验证工具或自定义逻辑可能只检查元素存在性,忽略属性约束。必须用符合W3C标准的验证器(如Java的javax.xml.validation、Python的lxml库)进行完整校验。测试时刻意删除某个必填属性(比如去掉<Payment>的Cur属性),标准验证器会抛出类似"缺少必需属性'Cur'"的异常。检查验证器配置
有些验证框架默认开启"宽松模式"或跳过属性验证,需确认是否启用了严格的Schema校验规则。比如Java中要确保SchemaFactory创建的Schema未被配置为忽略属性约束。补充属性非空约束(可选)
若需要确保属性不仅存在且非空,可在属性的简单类型中添加minLength="1"约束,示例:<xs:attribute name="ConNum" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> </xs:attribute>这样即使属性存在但为空字符串,验证器也会抛出异常。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

