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

时间:2014-06-17 14:15:48

标签: c# .net xml xsd

我正在针对XSD验证XML。这里没问题。但现在,我想知道我的限制哪个方面导致错误。

例如,有限制:

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我设法靠自己做。 我像这样检索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来修改错误消息。