针对XSD的验证:获取导致异常的第一个Facet



我正在根据XSD验证XML。没问题。但是现在,我想知道限制的哪个方面导致了错误。

例如,使用以下限制:

<xs:simpleType name="Max35Text">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="35"/>
</xs:restriction>
</xs:simpleType>

我想在ValidationEventHandler上检索facet XmlSchemaMaxLengthFacet,如果我的字符串长于35。我已经知道如何获得有关节点的限制列表,但我不知道如何找到导致异常的节点。我该怎么做呢?

感谢您的帮助

我设法自己做这件事。我像这样检索XmlSchemaSimpleTypeRestriction:

XmlSchemaSimpleTypeRestriction restriction;
XmlSchemaSimpleType simpleType;
switch (reader.NodeType)
{
    case XmlNodeType.EndElement:
       if (reader.SchemaInfo.SchemaElement == null) return null;
       simpleType = reader.SchemaInfo.SchemaElement.ElementSchemaType as XmlSchemaSimpleType;
       if (simpleType == null) return null;
       restriction = simpleType.Content as XmlSchemaSimpleTypeRestriction;
       break;
    case XmlNodeType.Attribute:
       if (reader.SchemaInfo.SchemaAttribute == null)
           return null;
       restriction = reader.SchemaInfo.SchemaAttribute.AttributeSchemaType.Content as XmlSchemaSimpleTypeRestriction;
           break;
    default:
       return null;
}
return restriction;

接下来,我解析它们的每个方面,并像这样尝试每个方面:

XmlSchemaMaxExclusiveFacet currentFacet = facet as XmlSchemaMaxExclusiveFacet;
if (Convert.ToDecimal(strXmlValue) >= Convert.ToDecimal(currentFacet.Value))
    return "error";            

如果它们都不是导致错误的原因,那么我使用XmlSchemaExceptionErrorType来调整错误消息。

最新更新